【算法简介】
线性筛主要用于O(n)计算积性函数
积性函数主要有:
还有当f(x)和g(x)都是积性函数时,狄利克雷卷积也是积性函数可以进行线性筛
【素数筛】
void shai()
{
for(int i=2;i<=n;i++)
{
if(!np[i])
p[++pcnt]=i;
for(int j=1;j<=pcnt && p[j]*i<=n;j++)
{
np[i*p[j]]=1;
if(i%p[j]==0) break;
}
}
}
【欧拉筛】
void shai()
{
phi[1]=1;
for(int i=2;i<=n;i++)
{
if(!np[i])
{
p[++pcnt]=i;
phi[i]=i-1;
}
for(int j=1;j<=pcnt && p[j]*i<=n;j++)
{
np[i*p[j]]=1;
if(i%p[j]==0)
{
phi[i*p[j]]=phi[i]*p[j];
break;
}
else
phi[i*p[j]]=phi[i]*(p[j]-1);
}
}
}
【莫比乌斯函数筛】
void shai()
{
mu[1]=1;
for(int i=2;i<=n;i++)
{
if(!np[i])
{
p[++pcnt]=i;
mu[i]=-1;
}
for(int j=1;j<=pcnt && p[j]*i<=n;j++)
{
np[i*p[j]]=1;
if(i%p[j]==0)
{
mu[i*p[j]]=0;
break;
}
else
mu[i*p[j]]=-mu[i];
}
}
}