013.质数筛

预处理 2 ~ n 的全部质数

埃氏筛

判断是否为质数

bitset<100005>ehrlich(int n){
    bitset<100005>isp;
    isp.set();//初始化为1
    isp[0]=isp[1]=0;
    for(int i=2;i*i<=n;++i){
        if(isp[i]){
            for(int j=i*i;j<=n;j+=i)
            isp[j]=0;
        }
    }
    return isp;
}

如果只用于统计质数数量

int cnt_p(int n){
    if(n<=1)return 0;
    vector<bool>vis(n+1,0);
    int cnt=(n+1)/2;
    for(int i=3;i*i<=n;i+=2){
        if(!vis[i]){
            for(int j=i*i;j<=n;j+=2*i){
                if(!vis[j]){
                    vis[j]=1;
                    cnt--;
                }
            }
        }
    }
    return cnt;
}

欧拉筛

获取 2 ~ n 所有质数

vector<int> euler(int n){
    vector<bool>vis(n+1,0);
    vector<int>p;
    for(int i=2;i<=n;i++){
        if(!vis[i])p.push_back(i);
        for(int j=0;j<(int)p.size()&&p[j]*i<=n;j++){
            vis[p[j]*i]=1;
            if(i%p[j]==0)break;
        }
    }
    return p;
}

预处理欧拉函数

int E[];
int p[];
bool isp[];
void EUler(int n){
    E[1]=1;
    int cnt=0;
    for(int i=2;i<=n;i++){
        if(!vis[i]){
            p[++cnt]=i;
            E[i]=i-1;
        }
        for(int j=1;j<=cnt&&p[j]*i<=n;j++){
            vis[i*p[j]]=1;
            if(i%p[j]==0){
                E[p[j]*i]=E[i]*p[j];
                break;
            }
            E[p[j]*i]=E[i]*(p[j]-1);
        }
    }
}

快期末了,越来越水了(?

posted @ 2025-12-17 23:43  射杀百头  阅读(13)  评论(0)    收藏  举报