为啥这代码在洛谷上能卡过去,spoj不行?
#include <bits/stdc++.h>
using namespace std;
#define N 510515
int inf = 510510;
int prime[51000000], pos[N], tot, cnt,n,T;
bool isprime[N], tem[N];
inline void write(int x){
if(x<0) x=~x+1,putchar('-');
if(x>9) write(x/10);
putchar(x%10+'0');
}
inline void init()
{
isprime[1]=1;tot=cnt=0;
for(int i=2;i<=inf;i++)
{
if (!isprime[i]) prime[++tot]=i;
for(int j=1;j<=tot && prime[j]<=inf/i;++j)
{
isprime[i*prime[j]]=1;
if (i%prime[j]==0) break;
}
}
for(int i=1;i<=inf;i++)
if (i%2&&i%3&&i%5&&i%7&&i%11&&i%13&&i%17)
pos[++cnt]=i;
for(int i=2;i<=1959;i++)
{
int r = i * inf, l = r - inf + 1;
memset(tem, 0, sizeof(tem));
for(int j=8;j<=tot && prime[j]*prime[j]<=r;++j)
{
int a=prime[j]*max(prime[j],(l-1)/prime[j]+1);
if (!(a&1)) a+=prime[j];
a-=(l-1);
while(a<=inf) tem[a]=1,a+=(prime[j]<<1);
}
for (int j = 1;j <= cnt;j++) if (!tem[pos[j]]) prime[++tot]=l+pos[j]-1;
}
return;
}
int main()
{
init();
scanf("%d",&T);
while ( T-- ) {
cin >> n;
write(prime[n]);
puts("");
}
return 0;
}