码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 4715 Difference Between Primes (素数表+二分)

时间:2015-08-19 23:32:00      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:

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

 

 

HDU 4715 Difference Between Primes (素数表+二分)

标签:

原文地址:http://www.cnblogs.com/clliff/p/4743538.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!