hdu 4715

来源:互联网 发布:画图软件solidworks 编辑:程序博客网 时间:2024/05/22 16:38

题目

已知n,求两个素数(a,b),要求a-b=n,且(a+b)尽量小,如果不存在这样的(a,b),就输出"FAIL"

想法:

二分找出比n大的最小的素数,然后直接暴力

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define M 5000001typedef long long ll;bool vis[M];int num;int r;int prime[M/5];void init(){    memset(vis,0,sizeof(vis));    vis[0]=vis[1]=1;    num=0;    for(int i=2;i<=M;i++)    {        if(!vis[i])        {            if(i<=1000000)             {                r=num;                prime[num++]=i;            }            for(ll j=(ll)i*i;j<=(ll)M;j+=i) vis[j]=1;        }    }}int t,n;int main(){    init();    scanf("%d",&t);    while(t--)    {        int p=0;        scanf("%d",&n);        if(n<0) p=1,n*=-1;        int s=0,e=r+1,m;        while(s<=e)        {            m=(s+e)>>1;            if(prime[m]>=n) e=m-1;            else  s=m+1;        }        int tag=0;        while(1)        {            if(s>=num) break;            if(prime[s]-n>=0&&vis[prime[s]-n]==0)            {                if(!p)                    printf("%d %d\n",prime[s],prime[s]-n);                else                     printf("%d %d\n",prime[s]-n,prime[s]);                tag=1;                break;            }            s++;            // if(s<0) break;        }        if(!tag) printf("FAIL\n");    }}


原创粉丝点击