线性筛合集
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];
}
}
}
标签:约数,const,int,init,ispri,线性,合集
From: https://www.cnblogs.com/LZMkingNB/p/17686004.html