注意几点:
1、数组开到1001005
2、用pos[]数组记录每个素数在prime数组的位置,这样会很快
3、有0和负数,坑啊!!!
31ms
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 1001005
bool is[MAXN];int prm[MAXN],pos[MAXN];
int k;
int getprm(int n){
int i,j,k;
for(i=0;i<n;i++) is[i]=true;
is[0]=is[1]=false;
k=0;
for(i=2;i<n;i++){
if(is[i]){
prm[k++]=i;
pos[i]=k-1;
for(j=i+i;j<n;j+=i)
is[j]=false;
}
}
return k;
}
int main()
{
int i,j,n,num,a,up,d,k=0,t,f=1;
scanf("%d",&n);
num=getprm(MAXN);//system("pause");
while(n--)
{
f=0;
scanf("%d",&a);
if(a<0){f=1;a=-a;}
d=prm[0];up=a+1;
k=0;
while(!is[up])up++;
t=pos[up];
bool flag=1;
while(flag)
{
if(up-d==a)
{
if(f==0){flag=0;printf("%d %d\n",up,d);}
else {flag=0;printf("%d %d\n",d,up);}
}
else
{
d=prm[++k];
}
if(up-d<a){d=prm[k=0];up=prm[++t];}
}
}
return 0;
}