一. 筛法
例题:codevs1430
1. 埃拉托斯特尼筛法
vis[1]=1;
for (int i=2;i<=n;i++)
if (!vis[i])
{
pri[++tot]=i;
for (int j=i*2;j<=n;j+=i)
vis[j]=1;
}
时间复杂度: O(nloglogn)
2. 欧拉筛法
写法:
vis[1]=1;
for (int i=2;i<=n;i++)
{
if (!vis[i])
pri[++tot]=i;
for (int j=1;j<=tot;j++)
{
if (i*pri[j]>n) break;
vis[i*pri[j]]=1;
if (i%pri[j]==0) break;
}
}
时间复杂度: O(n)
证:每个和数被最小的质因子筛去
二. 欧拉筛法解积性函数
1. 方法
步骤Ⅰ:证明积性
步骤Ⅱ:考虑下面三方面的实现:
①素数m,求f(m)
②m和比m的最小素因子小的素数n,求f(n*m)
③m和m的最小素因子n:求f(n*m)
2. 例子
(1)欧拉函数
题目:PC 1499
证明:设 n=∏apii,m=∏bqii ,且 gcd(m,n)=1
∴ϕ(mn)=mn∏(1−1ai)∏(1−1bi)=[n∗∏(1−1ai)]∗[m∗(∏(1−1bi)]=ϕ(n)ϕ(m)
写法:
①素数m: ϕ(m)=m−1
②m和比m的最小素因子小的素数n:
ϕ(m∗n)=ϕ(m)∗phi(n)
③m和m的最小素因子n: ϕ(m∗n)=ϕ(m)∗n
phi[1]=1;
for (int i=2;i<=n;i++)
{
if (!phi[i])
{
pri[++tot]=i;
phi[i]=i-1;
}
for (int j=1;j<=tot;j++)
{
if (i*pri[j]>n) break;
if (i%pri[j]!=0)
phi[i*pri[j]]=phi[i]*phi[pri[j]];
else
{
phi[i*pri[j]]=phi[i]*pri[j];
break;
}
}
}
(2)莫比乌斯函数
题目:PC 1492
积性证明:
设 n=∏apii,m=∏bqii ,且 gcd(m,n)=1
①若 ∃pi>1 或 qi>1 ,则 μ(n∗m)=μ(n)∗μ(m)=0
②否则,