线性筛板子

来源:互联网 发布:韩国网络女主播李秀彬 编辑:程序博客网 时间:2024/06/03 00:35

求素数

#include<cstdio>#include<cstring>using namespace std;const int N=10000000;bool noprime[N+5];int prime[N+5],size;void euler(int n){    for(int i=2;i<=n;i++){        if(!noprime[i]) prime[++size]=i;        for(int j=1;j<=size&&i*prime[j]<=n;j++){            noprime[i*prime[j]]=1;            if(i%prime[j]==0) break;        }    }    noprime[1]=1;//这里要记得特判 }int main(){    int n,m;    scanf("%d %d",&n,&m);    euler(n);    while(m--){        int x;        scanf("%d",&x);        if(noprime[x]) printf("No\n");        else printf("Yes\n");    }    return 0;}

欧拉函数——phi[ ]
莫比乌斯函数——mob[ ]
正约数个数——facnum[ ]
质因数个数——d[ ]

int prime[N],phi[N],mob[N],/**/facnum[N],d[N];bool noprime[N];/*莫比乌斯函数mob[i]若i为奇数个不同素数之积mob[i] = -1若i为偶数个不同素数之积mob[i] = 1若i有平方因子则mob[i] = 0。虽然在这里不用莫比乌斯函数 */void euler(){    int size=0;    phi[1]=1;mob[1]=1;facnum[1]=1;    for(int i=2;i<=N-5;i++){        if(!noprime[i]){            prime[++size]=i;            phi[i]=i-1;            mob[i]=-1;            facnum[i]=2;            d[i]=1;        }         for(int j=1;j<=size&&i*prime[j]<=N-5;j++){            noprime[i*prime[j]]=1;            if(i%prime[j]==0){                phi[i*prime[j]]=prime[j]*phi[i];//!!                facnum[i*prime[j]]=facnum[i]/(1+d[i])*(2+d[i]);                d[i*prime[j]]=d[i]+1;                mob[i*prime[j]]=0;                break;            }            phi[i*prime[j]]=phi[i]*(prime[j]-1);            facnum[i*prime[j]]=facnum[i]*2;            d[i*prime[j]]=1;            mob[i*prime[j]]=mob[i]*(-1);        }    }}
原创粉丝点击