线性筛/欧拉筛(模板)

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);
        }
    }
}
原文地址:https://www.cnblogs.com/Mmasker/p/11917472.html