线性筛合集

线性筛合集

1. 线性筛素数

void init()
{
    ispri[1]=true;
    for(int i=2;i<=n;i++)
    {
        if(!ispri[i])pri[++cnt]=i;
        for(int l=1;l<=cnt && i*pri[l]<=n;l++)
        {
            ispri[i*pri[l]]=true;
            if(i%pri[l]==0)break;
        }
    }
}

2.线性筛约数个数

const int N=1000010;
const int M=1000000;

int pri[N],d[N],num[N];
bool ispri[N];
int cnt;
/*
    d[i]代表i的约数个数
    num[i]代表i的的小质因子个数
*/
void init()
{
    ispri[1]=true;d[1]=1;num[1]=1;
    for(int i=2;i<=M;i++)
    {
        if(!ispri[i])
        {
            pri[++cnt]=i;
            d[i]=2;
            num[i]=1;
        }
        for(int l=1;l<=cnt && i*pri[l]<=M;l++)
        {
            ispri[i*pri[l]]=true;
            if(i%pri[l]==0)
            {
                num[i*pri[l]]=num[i]+1;
                d[i*pri[l]]=d[i]/(num[i]+1)*(num[i]+2);
                break;
            }
            num[i*pri[l]]=1;
            d[i*pri[l]]=d[i]*d[pri[l]];
        }
    }
}

3.线性筛莫比乌斯函数

const int N=1000010;
const int M=1000000;

int pri[N],mu[N];
bool ispri[N];
int cnt;
/*
    mu[i]代表i的莫比乌斯函数
*/
void init()
{
    ispri[1]=true;mu[1]=1;
    for(int i=2;i<=M;i++)
    {
        if(!ispri[i])pri[++cnt]=i,mu[i]=-1;
        for(int l=1;l<=cnt && i*pri[l]<=M;l++)
        {
            ispri[i*pri[l]]=true;
            if(i%pri[l]==0)
            {
                mu[i*pri[l]]=0;
                break;
            }
            mu[i*pri[l]]-=mu[i];
        }
    }
}

4.线性筛求约数和

const int N=1000010;
const int M=1000000;

int pri[N],sd[N],sp[N];
bool ispri[N];
int cnt;
/*
    sd[i]代表i的约数和
    sp[i]代表i的最小质因子等比数列的和
    sd[i]=(1+p1+p1^2+.....+p1^a1)*(1+p2+p2^2+.....+p2^a2)*...*(1+pi+pi^2+.....+pi^ai)
*/
void init()
{
    ispri[1]=true;sd[1]=1;sp[1]=1;
    for(int i=2;i<=M;i++)
    {
        if(!ispri[i])
        {
            pri[++cnt]=i;
            sd[i]=i+1;
            sp[i]=i+1;
        }
        for(int l=1;l<=cnt && i*pri[l]<=M;l++)
        {
            ispri[i*pri[l]]=true;
            if(i%pri[l]==0)
            {
                sp[i*pri[l]]=sp[i]*pri[l]+1;
                sd[i*pri[l]]=sd[i]/sp[i]*sp[i*pri[l]];    
                break;
            }
            sd[i*pri[l]]=sd[i]*sd[pri[l]];
            sp[i*pri[l]]=1+pri[l];
        }
    }
}
posted @ 2023-09-07 20:32  镜予歌  阅读(22)  评论(0)    收藏  举报