已知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 5000001
typedef 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");
}
}