比较优秀的线性筛
int prime[maxn]; int mu[maxn]; void init(){ int M=maxn; memset(prime,0,sizeof(prime)); memset(mu,0,sizeof(mu)); memset(vis,0,sizeof(vis)); mu[1]=1; int cnt=1; for (int i=2;i<maxn;i++){ if (!vis[i]){//质数 prime[cnt++]=i; mu[i]=-1;//质数的mobius为-1 } for (int j=1;j<cnt && i*prime[j]<maxn ;j++){ vis[i*prime[j]]=1;//筛掉 if (i%prime[j])mu[i*prime[j]]=-mu[i]; else { mu[i*prime[j]]=0; break; } } } }
比较垃圾的普通筛法
void init(){ int M=maxn; memset(prime,0,sizeof(prime)); memset(mu,0,sizeof(mu)); memset(vis,0,sizeof(vis)); mu[1]=1; int cnt=0; for (int i=1;i<maxn-1;i++){ mu[i]=1; vis[i]=0; } for (int i=2;i<maxn;i++){ if (vis[i])continue; mu[i]=-1; for (int j=2*i;j<maxn;j+=i){ vis[j]=1; if ((j/i)%i==0)mu[j]=0; else mu[j]*=-1; } } }