数论 ural 1356. Something Easier
2012-03-22 12:12
232 查看
思路:根据哥德巴赫猜想,
任一大于2的偶数都可写成两个质数之和。
任一大于7的奇数都可写成三个素数之和。
详细内容可参照维基百科http://zh.wikipedia.org/wiki/%E5%93%A5%E5%BE%B7%E5%B7%B4%E8%B5%AB%E7%8C%9C%E6%83%B3。
任一大于2的偶数都可写成两个质数之和。
任一大于7的奇数都可写成三个素数之和。
详细内容可参照维基百科http://zh.wikipedia.org/wiki/%E5%93%A5%E5%BE%B7%E5%B7%B4%E8%B5%AB%E7%8C%9C%E6%83%B3。
#include <iostream> #include <sstream> #include <string> #include <queue> #include <stack> #include <vector> #include <list> #include <map> #include <algorithm> #include <numeric> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> #include <set> #include <deque> #include <bitset> #include <functional> #include <utility> #include <iomanip> #include <cctype> using namespace std; #define FOR(i,a,b) for(i = (a); i < (b); ++i) #define FORE(i,a,b) for(i = (a); i <= (b); ++i) #define FORD(i,a,b) for(i = (a); i > (b); --i) #define FORDE(i,a,b) for(i = (a); i >= (b); --i) #define max(a,b) ((a) > (b)) ? (a) : (b) #define min(a,b) ((a) < (b)) ? (a) : (b) #define CLR(a,b) memset(a,b,sizeof(a)) #define PB(x) push_back(x) typedef long long LL; typedef vector<int> VI; const int MAXN = 31623; const int hash_size = 25000002; const int INF = 0x7f7f7f7f; bool p[MAXN]={0}, flag; int prime[MAXN]={0}, q[4], n, d; void init() { int i; for(i = 2; i <= 31622; i++) if(!p[i]) { prime[0]+=1; prime[prime[0]]=i; for(int j=i+i;j<=31622;j+=i) p[j]=true; } } bool isprime(int n){ if (n == 2) return true; else { int sq, i; sq = int(sqrt(n*1.0)); for (i = 2; i <= sq+1; ++i) if (n%i == 0) return false; return true; } } void dfs(int k,int x,int y) { int i; if (flag) return; if (k == 1) { if (isprime(x)) { FORD(i, d, 1) printf("%d ", prime[q[i]]); printf("%d\n", x); flag = true; } return; } for (i = y; i<=prime[0]; ++i) { if (prime[i]*k > x) return; q[k] = i; dfs(k-1, x-prime[i], i); } } int main() { init(); int t, i; scanf("%d", &t); while (t--) { scanf("%d", &n); if (isprime(n)) printf("%d\n", n); else if (n&1) { d = 1; flag = false; while (!flag) dfs(++d, n, 1); } else { int tmp; FORE(i, 1, prime[0]) { tmp = n - prime[i]; if (isprime(tmp)) { printf("%d %d\n", prime[i], tmp); break; } } } } return 0; }
相关文章推荐
- URAL1356(数论)
- ural 1356. Something Easier(数论,哥德巴赫猜想)
- Ural 2003: Simple Magic(数论&思维)
- Ural1110(数论)
- [求解二次剩余 数论技巧 随机化] Ural 1132 Square Root
- URAL 1104 Don’t Ask Woman about Her Age(数论)
- URAL 1133 Fibonacci Sequence(数论)
- URAL 2070 Interesting Numbers(数论)
- URAL——1204(数论之线性方程)
- URAL - 1356
- ural 2070 Interesting Numbers(数论基础)
- URAL 1132 Square Root <二次剩余 + 数论>
- URAL 1876 Centipede's Morning[数论]
- URAL 1356 哥德巴赫猜想
- ural 1049. Brave Balloonists(标准分解式,数论)
- URAL 1139 City Blocks(数论)
- ural 2003. Simple Magic 数论 因数分解
- URAL 1104(数论)
- URAL1780----格雷码的应用,数论
- LightOJ-1356-二分图匹配Hopcroft-Carp+数论