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;
}
View Code

 

 
posted @ 2015-08-19 21:36  Cliff Chen  阅读(139)  评论(0编辑  收藏  举报