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\n",pri[i],pri[i]+x);
45             }
46             else{
47                 printf("%d %d\n",pri[i]+x,pri[i]);
48             }
49         }
50     }
51     return 0;
52 }

 

转载于:https://www.cnblogs.com/keximeiruguo/p/7657962.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值