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): 4158    Accepted Submission(s): 1194


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
 
NOIP2017准备之线性筛法
 
 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 typedef long long LL;
 4 const int MAX=1e6+5;
 5 int n,cas;
 6 int pri[MAX];
 7 bool t[MAX];
 8 inline int read(){
 9     int an=0,x=1;char c=getchar();
10     while (c<'0' || c>'9') {if (c=='-') x=-1;c=getchar();}
11     while (c>='0' && c<='9') {an=an*10+c-'0';c=getchar();}
12     return an*x;
13 }
14 void Prime(){
15     int i,j;
16     memset(t,true,sizeof(t));
17     for (i=2;i<MAX;i++){
18         if (t[i]) pri[++pri[0]]=i;
19         for (j=1;j<=pri[0] && pri[j]*i<MAX;j++){
20             t[i*pri[j]]=false;
21             if (i%pri[j]==0) break;
22         }
23     }
24 }
25 int main(){
26     freopen ("prime.in","r",stdin);
27     freopen ("prime.out","w",stdout);
28     int i,j,x;
29     Prime();
30     bool fu;
31     cas=read();
32     while (cas--){
33         x=read();
34         fu=false;
35         if (x<0){fu=true;x=-x;}
36         bool flag=false;
37         for (i=1;i<=pri[0];i++){
38             if (pri[i]+x>=MAX) continue;
39             if (t[pri[i]+x]) break;
40         }
41         if (i==pri[0]+1){puts("FAIL");}
42         else{
43             if (fu){
44                 printf("%d %d
",pri[i],pri[i]+x);
45             }
46             else{
47                 printf("%d %d
",pri[i]+x,pri[i]);
48             }
49         }
50     }
51     return 0;
52 }
未来是什么样,未来会发生什么,谁也不知道。 但是我知道, 起码从今天开始努力, 肯定比从明天开始努力, 要快一天实现梦想。 千里之行,始于足下! ——《那年那兔那些事儿》
原文地址:https://www.cnblogs.com/keximeiruguo/p/7657962.html