0%

线性筛莫比乌斯函数

模拟赛中的一道题,让我发现自己莫比乌斯函数的基础十分薄弱。😢

推导

先来看看莫比乌斯函数的定义:

n=i=1Npikin=\prod_{i=1}^Np_i^{k_i}pp 为质数集合),则

μ(n)={1n=1(1)N1iN,ki=10ki>1\mu(n)= \begin{cases} 1&n=1\\ (-1)^N&\forall1\leq i\leq N,k_i=1\\ 0&k_i>1 \end{cases}

ipi\in p 时,显然 μ(i)=1\mu(i)=-1

n=np1n^\prime=\frac n{p_1},在线性筛中,nn 通过 np1n^\prime\cdot p_1 被筛去。

np1n^\prime\mid p_1,即 k1>1k_1>1 时,μ(n)=0\mu(n)=0

否则 nn^\primeN1N-1 个质因子。

如果 μ(n)0\mu(n^\prime)\neq0,即 2iN,ki=1\forall2\leq i\leq N,k_i=1 时,根据定义得:

μ(n)=(1)N=(1)N1(1)=μ(n)(1)=μ(n)\begin{aligned}\mu(n)&=(-1)^N\\&=(-1)^{N-1}\cdot(-1)\\&=\mu(n^\prime)\cdot(-1)\\&=-\mu(n^\prime)\end{aligned}

如果 μ(n)=0\mu(n^\prime)=0,则 nn^\prime 一定有次数大于 11 的质因子,所以 nn 也一定有,即 μ(n)=0\mu(n)=0

此时 μ(n)=μ(n)\mu(n)=-\mu(n^\prime) 仍成立。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mu[1]=1;
for(int i=2;i<=N;++i) {
if(!npri[i]) {
pri[++cnt]=i;
mu[i]=-1;
}
for(int j=1,tem;(j<=cnt)&&((tem=i*pri[j])<=N);++j) {
npri[tem]=true;
if(i%pri[j]==0) {
break;
}
mu[tem]=-mu[i];
}
}

资料

本文部分参考线性筛法筛素数、莫比乌斯函数、欧拉函数 | Menci’s Blog