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);
}
}
}