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);
}
}
}
对线性筛的运行还不是特别清晰,因此,先放上自己模仿别人写的代码。