1.线性素数筛
int prime[MAXN],vis[MAXN]; int cnt; void init(){ for(int i=2;i<MAXN;i++){ if(!vis[i])prime[++cnt]=i; for(int j=1;j<=cnt;j++){ if(i*prime[j]>=MAXN)break; vis[i*prime[j]]=1; if(i%prime[j]==0)break; } } }
2.欧拉函数筛
int prime[MAXN],vis[MAXN],phi[MAXN]; int cnt; void init(){ for(int i=2;i<MAXN;i++){ if(!vis[i]){ prime[++cnt]=i; phi[i]=i-1; } for(int j=1;j<=cnt;j++){ if(i*prime[j]>=MAXN)break; vis[i*prime[j]]=1; if(i%prime[j]==0){ phi[i*prime[j]]=phi[i]*prime[j]; break; } else phi[i*prime[j]]=phi[i]*(prime[j]-1); } } }