求助
查看原帖
求助
1001552
newsname楼主2023/8/29 10:22

为啥这代码在洛谷上能卡过去,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;
}
2023/8/29 10:22
加载中...