线筛四连

放肆的年华 提交于 2019-11-26 14:27:24

线筛莫比乌斯函数

int prime[maxn],mu[maxn],cnt;
bool vis[maxn];

void init(){
    mu[1]=1;
    for(int i=2;i<maxn;i++){
        if(!vis[i]){
            prime[cnt++]=i;
            mu[i]=-1;
        }
        for(int j=0;j<cnt&&i*prime[j]<maxn;j++){
            vis[i*prime[j]]=true;
            if(i%prime[j]) mu[i*prime[j]]=-mu[i];
            else{
                mu[i*prime[j]]=0;
                break;
            }
        }
    }
}

线筛欧拉函数

int prime[maxn],phi[maxn],cnt;
bool vis[maxn];

void init(){
    phi[1]=1;
    for(int i=2;i<maxn;i++){
        if(!vis[i]){
            prime[cnt++]=i;
            phi[i]=i-1;
        }
        for(int j=0;j<cnt&&i*prime[j]<maxn;j++){
            vis[i*prime[j]]=true;
            if(i%prime[j]==0){
                phi[i*prime[j]]=phi[i]*prime[j];
                break;
            }
            else  phi[i*prime[j]]=phi[i]*(prime[j]-1);
        }
    }
}

线筛因子个数

int prime[maxn],d[maxn],num[maxn];
bool vis[maxn];
int cnt;

void init(){
    d[1]=1;
    for(int i=2;i<maxn;i++){
        if(!vis[i]){
            d[i]=2;
            num[i]=1;
            prime[cnt++]=i;
        }
        for(int j=0;j<cnt&&i*prime[j]<maxn;j++){
            vis[i*prime[j]]=true;
            if(i%prime[j]==0){
                num[i*prime[j]]=num[i]+1;
                d[i*prime[j]]=d[i]/(num[i]+1)*(num[i]+2);
                break;
            } else {
                num[i*prime[j]]=1;
                d[i*prime[j]]=d[i]<<1;
            }
        }
    }
}

线筛因子和

int prime[maxn],sum[maxn],num[maxn];
bool vis[maxn];
int cnt;

void init(){
    sum[1]=num[1]=1;
    for(int i=2;i<maxn;i++){
        if(!vis[i]){
            num[i]=sum[i]=i+1;
            prime[cnt++]=i;
        }
        for(int j=0;j<cnt&&i*prime[j]<maxn;j++){
            vis[i*prime[j]]=true;
            if(i%prime[j]==0){
                num[i*prime[j]]=num[i]*prime[j]+1;
                sum[i*prime[j]]=sum[i]/num[i]*num[i*prime[j]];
                break;
            } else {
                num[i*prime[j]]=prime[j]+1;
                sum[i*prime[j]]=sum[i]*(prime[j]+1);
            }
        }
    }
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!