利用wilson’s theorem可知所求的就是sum{[3*k+7为素数]|1<=k<=n},只要预处理出3000007内的素数表就可以预处理出解,然后就可以直接输出了。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn=5000010;
int vis[maxn];
int cnt[maxn];
void init()
{
memset(vis,0,sizeof(vis));
memset(cnt,0,sizeof(cnt));
for(int i=2;i<=2000;i++) if(!vis[i])
{
for(int j=i*i;j<=4000000;j+=i) vis[j]=1;
}
for(int i=8;i<=4000000;i++) if((!vis[i]) && (i-7)%3==0)
cnt[(i-7)/3]=1;
for(int i=1;i<=1000000;i++) cnt[i]+=cnt[i-1];
}
int main()
{
// freopen("in.txt","r",stdin);
init();
int q,n;
scanf("%d",&q);
while(q--)
{
scanf("%d",&n);
printf("%d\n",cnt[n]);
}
return 0;
}