HDU 4715 Difference Between Primes (素数表+二分)
Difference Between Primes
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2998 Accepted Submission(s): 850
Problem Description
All you know Goldbach conjecture.That is to say, Every even integer greater than 2 can be expressed as the sum of two primes. Today, skywind present a new conjecture: every even integer can be expressed as the difference of two primes. To validate this conjecture, you are asked to write a program.
Input
The first line of input is a number nidentified the count of test cases(n<10^5). There is a even number xat the next nlines. The absolute value of xis not greater than 10^6.
Output
For each number xtested, outputstwo primes aand bat one line separatedwith one space where a-b=x. If more than one group can meet it, output the minimum group. If no primes can satisfy it, output 'FAIL'.
Sample Input
3
6
10
20
Sample Output
11 5
13 3
23 3
Source
题意:求两个素数的差为一个偶数的素数组合,如果存在多个,输出小的
分析:打出素数表,然后从小的开始枚举,二分查找就行。不过很奇怪的是,我一开始没有看到要加FAIL竟然也过了,也是醉的不行。
#pragma comprint(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<string> #include<iostream> #include<cstring> #include<cmath> #include<stack> #include<queue> #include<vector> #include<map> #include<stdlib.h> #include<ctime> #include<algorithm> #define LL __int64 #define FIN freopen("in.txt","r",stdin) using namespace std; const int MAXN=5000000; int pri[MAXN],vis[MAXN]; int x,cnt; void sieve(int n) { int m=(int)sqrt(n+0.5); memset(vis,0,sizeof(vis)); for(int i=2;i<=m;i++) if(!vis[i]) for(int j=i*i;j<=n;j+=i) vis[j]=1; } int init(int n) { sieve(n); cnt=0; for(int i=2;i<=n;i++) if(!vis[i]) pri[++cnt]=i; } int main() { //FIN; init(MAXN); int kase; scanf("%d",&kase); while(kase--) { bool flag=false; scanf("%d",&x); for(int i=1;i<cnt;i++) { int id=lower_bound(pri+1,pri+cnt,pri[i]+x)-pri; if(pri[id]==pri[i]+x) { printf("%d %d\n",pri[id],pri[i]); flag=true; break; } } if(!flag) printf("FAIL\n"); } return 0; }