数学专项number_theory:LA 4382

来源:互联网 发布:网络6524是什么意思啊 编辑:程序博客网 时间:2024/05/24 08:33

利用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;}