莫比乌斯反演主要用于快速计算一些阴间式子(包含
gcd
(
i
,
j
)
\gcd(i,j)
gcd(i,j) 等)。
至于如何应用,往下看。
莫比乌斯函数
μ ( x ) = { 1 x = 1 0 n 含有平方因子 ( − 1 ) k k 为 n 本质不同质因子个数 \mu(x)=\begin{cases}1&x=1\\ 0&n 含有平方因子\\ (-1)^k & k 为 n 本质不同质因子个数 \end{cases} μ(x)=⎩ ⎨ ⎧10(−1)kx=1n含有平方因子k为n本质不同质因子个数
假设
x
=
∏
i
=
1
k
p
i
c
i
x = \prod\limits_{i=1}^{k}p_i^{c_i}
x=i=1∏kpici,其中
p
i
p_i
pi 为质数,
c
i
≥
1
c_i \geq 1
ci≥1。(
20
=
2
2
×
5
20 = 2^2 \times 5
20=22×5)
若
x
=
1
x= 1
x=1,则
μ
(
x
)
=
1
\mu(x) = 1
μ(x)=1。
若存在
c
i
>
1
c_i >1
ci>1,则
μ
(
x
)
=
0
\mu(x) = 0
μ(x)=0。
若
c
i
≤
1
c_i \leq 1
ci≤1,则
μ
(
x
)
=
(
−
1
)
k
\mu(x) = (-1)^k
μ(x)=(−1)k。
由于莫比乌斯函数可以 O ( n ) O(n) O(n) 线性筛预处理,所以我们大可以将题目中的式子转化成包含莫比乌斯函数的式子。以此来减少计算时间复杂度。
性质
性质 #1
μ ∗ 1 = ϵ \mu * 1=\epsilon μ∗1=ϵ,即
∑ d ∣ n μ ( d ) = [ n = 1 ] \sum_{d|n}\mu(d)=[n=1] d∣n∑μ(d)=[n=1]
补充:狄利克雷卷积
函数 f ( x ) f(x) f(x), g ( x ) g(x) g(x) 的狄利克雷卷积 ( f ∗ g ) ( x ) = ∑ d ∣ x f ( x ) g ( x d ) (f * g)(x) = \sum\limits_{d|x}f(x)g(\frac{x}{d}) (f∗g)(x)=d∣x∑f(x)g(dx)
可以看成: ( f ∗ g ) ( x ) = ∑ i ∑ j f ( i ) g ( j ) [ i j = x ] (f * g)(x) = \sum\limits_{i}\sum\limits_{j}f(i)g(j)[ij=x] (f∗g)(x)=i∑j∑f(i)g(j)[ij=x]
补充:狄利克雷卷积单位元 ϵ \epsilon ϵ
ϵ ( x ) = [ x = 1 ] \epsilon(x)=[x=1] ϵ(x)=[x=1]
性质:对于任意一个函数 f f f,有 f ∗ ϵ = f f*\epsilon=f f∗ϵ=f。
性质 #2
μ ∗ d = 1 \mu * \operatorname{d} =1 μ∗d=1,即
∑ i ∣ n μ ( i ) d ( n i ) = 1 \sum_{i|n}\mu(i)\operatorname{d}(\frac{n}{i}) = 1 i∣n∑μ(i)d(in)=1
补充:约数个数函数 d ( x ) \operatorname{d}(x) d(x)
d ( n ) = n 的约数个数 = ∑ d = 1 n [ d ∣ n ] \operatorname{d}(n)=n的约数个数=\sum_{d=1}^{n}[d|n] d(n)=n的约数个数=d=1∑n[d∣n]
结论
套路
接下来我会讲一些结论以及其证明,通过这些结论和证明过程(还有你的思维技巧),可以解决一些莫反问题。
结论 #1
∑
i
=
1
n
∑
j
∣
i
f
(
j
)
=
∑
i
f
(
i
)
⌊
n
i
⌋
\sum_{i=1}^{n}\sum_{j|i}f(j) = \sum_{i}f(i)\left\lfloor\frac{n}{i}\right\rfloor
i=1∑nj∣i∑f(j)=i∑f(i)⌊in⌋
此结论可以在和式后面的式子
f
f
f 与
i
i
i 无关,但其有关的变量
j
j
j 为
i
i
i 的因数时使用。
最后可以通过整除分块或者其他方法快速处理
⌊
n
i
⌋
\left\lfloor\frac{n}{i}\right\rfloor
⌊in⌋。
证明:
∑
i
=
1
n
∑
j
∣
i
f
(
j
)
\sum_{i=1}^{n}\sum_{j|i}f(j)
i=1∑nj∣i∑f(j)
将
j
∣
i
j|i
j∣i 提出:
=
∑
i
=
1
n
∑
j
f
(
j
)
[
j
∣
i
]
=\sum_{i=1}^{n}\sum_{j}f(j)[j|i]
=i=1∑nj∑f(j)[j∣i]
换位:
=
∑
j
∑
i
=
1
n
f
(
j
)
[
j
∣
i
]
=\sum_{j}\sum_{i=1}^{n}f(j)[j|i]
=j∑i=1∑nf(j)[j∣i]
将
j
∣
i
j|i
j∣i 塞回:
=
∑
j
∑
i
=
1
,
j
∣
i
n
f
(
j
)
=\sum_{j}\sum_{i=1,j|i}^{n}f(j)
=j∑i=1,j∣i∑nf(j)
让
i
=
j
i
′
i = ji'
i=ji′,可以消去
j
∣
i
j|i
j∣i 条件:
=
∑
j
∑
i
′
=
1
,
j
i
′
≤
n
f
(
j
)
=\sum_{j}\sum_{i'=1,ji'\leq n}f(j)
=j∑i′=1,ji′≤n∑f(j)
由于
(
∀
j
i
′
≤
n
)
(
i
′
≤
⌊
n
j
⌋
)
(\forall ji'\leq n)(i'\leq\left\lfloor\frac{n}{j}\right\rfloor)
(∀ji′≤n)(i′≤⌊jn⌋):
=
∑
j
∑
i
′
=
1
⌊
n
j
⌋
f
(
j
)
=\sum_{j}\sum_{i'=1}^{\left\lfloor\frac{n}{j}\right\rfloor}f(j)
=j∑i′=1∑⌊jn⌋f(j)
f
(
j
)
f(j)
f(j) 与
i
i
i 无关,所以:
=
∑
j
f
(
j
)
⌊
n
j
⌋
=\sum_{j}f(j)\left\lfloor\frac{n}{j}\right\rfloor
=j∑f(j)⌊jn⌋
换变量名:
=
∑
i
f
(
i
)
⌊
n
i
⌋
=\sum_{i}f(i)\left\lfloor\frac{n}{i}\right\rfloor
=i∑f(i)⌊in⌋
结论 #2
∑
i
=
1
n
∑
j
=
1
⌊
n
i
⌋
f
(
i
,
j
)
=
∑
i
=
1
n
∑
j
∣
i
f
(
j
,
i
j
)
\sum_{i=1}^{n}\sum_{j=1}^{\left\lfloor\frac{n}{i}\right\rfloor}f(i,j)=\sum_{i=1}^{n}\sum_{j|i}f(j,\frac{i}{j})
i=1∑nj=1∑⌊in⌋f(i,j)=i=1∑nj∣i∑f(j,ji)
此结论可以转换求和公式,从而尝试化简。
证明
读者自证不难。
∑
i
=
1
n
∑
j
=
1
⌊
n
i
⌋
f
(
i
,
j
)
\sum_{i=1}^{n}\sum_{j=1}^{\left\lfloor\frac{n}{i}\right\rfloor}f(i,j)
i=1∑nj=1∑⌊in⌋f(i,j)
我们令
T
=
i
j
T = ij
T=ij,则有:
=
∑
i
=
1
n
∑
T
=
i
,
i
∣
T
n
f
(
i
,
T
i
)
=\sum_{i=1}^{n}\sum_{T=i, i|T}^{n}f(i,\frac{T}{i})
=i=1∑nT=i,i∣T∑nf(i,iT)
由于
(
∀
T
<
i
)
(
i
∤
T
)
(\forall T<i)(i\not|~T)
(∀T<i)(i∣ T),有:
=
∑
i
=
1
n
∑
T
=
1
,
i
∣
T
n
f
(
i
,
T
i
)
=\sum_{i=1}^{n}\sum_{T=1, i|T}^{n}f(i,\frac{T}{i})
=i=1∑nT=1,i∣T∑nf(i,iT)
将
i
∣
T
i|T
i∣T 提出:
=
∑
i
=
1
n
∑
T
=
1
n
f
(
i
,
T
i
)
[
i
∣
T
]
=\sum_{i=1}^{n}\sum_{T=1}^{n}f(i,\frac{T}{i})[i|T]
=i=1∑nT=1∑nf(i,iT)[i∣T]
交换两个
Σ
\Sigma
Σ:
=
∑
T
=
1
n
∑
i
=
1
n
f
(
i
,
T
i
)
[
i
∣
T
]
=\sum_{T=1}^{n}\sum_{i=1}^{n}f(i,\frac{T}{i})[i|T]
=T=1∑ni=1∑nf(i,iT)[i∣T]
将
i
∣
T
i|T
i∣T 再放入
i
i
i 的
Σ
\Sigma
Σ 中提出:
=
∑
T
=
1
n
∑
i
=
1
,
i
∣
T
n
f
(
i
,
T
i
)
=\sum_{T=1}^{n}\sum_{i=1,i|T}^{n}f(i,\frac{T}{i})
=T=1∑ni=1,i∣T∑nf(i,iT)
由于
(
∀
i
>
T
)
(
i
∤
T
)
(\forall i> T)(i\not|~T)
(∀i>T)(i∣ T),我们可以将
i
=
1...
n
i=1...n
i=1...n 的限制去掉:
=
∑
T
=
1
n
∑
i
∣
T
f
(
i
,
T
i
)
=\sum_{T=1}^{n}\sum_{i|T}f(i,\frac{T}{i})
=T=1∑ni∣T∑f(i,iT)
再换个变量名:
=
∑
i
=
1
n
∑
j
∣
i
f
(
j
,
i
j
)
=\sum_{i=1}^{n}\sum_{j|i}f(j,\frac{i}{j})
=i=1∑nj∣i∑f(j,ji)
结论 #3
∑ i = 1 n ∑ j = 1 m [ gcd ( i , j ) = 1 ] = ∑ d μ ( d ) ⌊ n d ⌋ ⌊ m d ⌋ \sum_{i=1}^{n}\sum_{j=1}^{m}[\gcd(i,j) =1] = \sum_{d}\mu(d)\left\lfloor\frac{n}{d}\right\rfloor\left\lfloor\frac{m}{d}\right\rfloor i=1∑nj=1∑m[gcd(i,j)=1]=d∑μ(d)⌊dn⌋⌊dm⌋
终于遇到 μ \mu μ 了(
经典结论,用来化简 gcd \gcd gcd 函数,其实其核心思想是 [ d ∣ gcd ( i , j ) ] = [ d ∣ i ] [ d ∣ j ] [d|\gcd(i,j)]=[d|i][d|j] [d∣gcd(i,j)]=[d∣i][d∣j]。
证明:
∑
i
=
1
n
∑
j
=
1
m
[
gcd
(
i
,
j
)
=
1
]
\sum_{i=1}^{n}\sum_{j=1}^{m}[\gcd(i,j) =1]
i=1∑nj=1∑m[gcd(i,j)=1]
莫比乌斯函数性质可转化为(
∑
d
∣
n
μ
(
d
)
=
[
n
=
1
]
\sum\limits_{d|n}\mu(d)=[n=1]
d∣n∑μ(d)=[n=1]):
=
∑
i
=
1
n
∑
j
=
1
m
∑
d
∣
gcd
(
i
,
j
)
μ
(
d
)
=\sum_{i=1}^{n}\sum_{j=1}^{m}\sum_{d|\gcd(i,j)}\mu(d)
=i=1∑nj=1∑md∣gcd(i,j)∑μ(d)
由于
d
∣
g
c
d
(
i
,
j
)
⇒
(
d
∣
i
and
d
∣
j
)
d|gcd(i,j) \Rarr (d|i \operatorname{and} d|j)
d∣gcd(i,j)⇒(d∣iandd∣j) 可知:
=
∑
i
=
1
n
∑
j
=
1
m
∑
d
∣
i
,
d
∣
j
μ
(
d
)
=\sum_{i=1}^{n}\sum_{j=1}^{m}\sum_{d|i,d|j}\mu(d)
=i=1∑nj=1∑md∣i,d∣j∑μ(d)
根据结论 #2,有:
=
∑
d
μ
(
d
)
⌊
n
d
⌋
⌊
m
d
⌋
=\sum_{d}\mu(d)\left\lfloor\frac{n}{d}\right\rfloor\left\lfloor\frac{m}{d}\right\rfloor
=d∑μ(d)⌊dn⌋⌊dm⌋
也可以等于
=
∑
d
=
1
n
μ
(
d
)
⌊
n
d
⌋
⌊
m
d
⌋
=\sum_{d=1}^{n}\mu(d)\left\lfloor\frac{n}{d}\right\rfloor\left\lfloor\frac{m}{d}\right\rfloor
=d=1∑nμ(d)⌊dn⌋⌊dm⌋
结论 #4
f
(
x
)
=
∑
i
i
[
f
(
x
)
=
i
]
f(x)=\sum_{i}i[f(x)=i]
f(x)=i∑i[f(x)=i]
使用此结论可以把一些函数的求和转换为判断,例如:
gcd
(
i
,
j
)
\gcd(i,j)
gcd(i,j)(这是最常见的操作)。
证明
留作习题
那么由于
i
i
i 可以取任何值,而且任何值只会取一次。所以只有一个
i
i
i 满足
i
=
f
(
x
)
i=f(x)
i=f(x)。
- 当 i ≠ f ( x ) i\not=f(x) i=f(x) 时, i [ f ( x ) = i ] = 0 i[f(x)=i]=0 i[f(x)=i]=0。
- 当 i = f ( x ) i=f(x) i=f(x) 时, i [ f ( x ) = i ] = i = f ( x ) i[f(x)=i]=i=f(x) i[f(x)=i]=i=f(x)。
所以 f ( x ) = ∑ i i [ f ( x ) = i ] f(x)=\sum\limits_{i}i[f(x)=i] f(x)=i∑i[f(x)=i]
结论 #5
f
(
x
)
=
∏
i
i
[
f
(
x
)
=
i
]
f(x)=\prod_{i}i^{[f(x)=i]}
f(x)=i∏i[f(x)=i]
使用此结论可以把一些函数的连乘转换为判断,例如:
gcd
(
i
,
j
)
\gcd(i,j)
gcd(i,j)。也是常见套路。
更好的是这种转换可以将函数丢到指数位置上,从而把 Π \Pi Π 变成 Σ \Sigma Σ。
例如:
∏ i n ∏ j m gcd ( i , j ) = ∏ d ∏ i n ∏ j m d [ gcd ( i , j ) = d ] = ∏ d d ∑ i n ∑ j m [ gcd ( i , j ) = d ] \prod_{i}^{n}\prod_{j}^{m}\gcd(i,j)=\prod_{d}\prod_{i}^{n}\prod_{j}^{m}d^{[\gcd(i,j)=d]} = \prod_{d}d^{\sum\limits_{i}^{n}\sum\limits_{j}^{m}[\gcd(i,j)=d]} i∏nj∏mgcd(i,j)=d∏i∏nj∏md[gcd(i,j)=d]=d∏di∑nj∑m[gcd(i,j)=d]
证明
留作习题
那么由于
i
i
i 可以取任何值,而且任何值只会取一次。所以只有一个
i
i
i 满足
i
=
f
(
x
)
i=f(x)
i=f(x)。
- 当 i ≠ f ( x ) i\not=f(x) i=f(x) 时, i [ f ( x ) = i ] = 1 i^{[f(x)=i]}=1 i[f(x)=i]=1。
- 当 i = f ( x ) i=f(x) i=f(x) 时, i [ f ( x ) = i ] = i = f ( x ) i^{[f(x)=i]}=i=f(x) i[f(x)=i]=i=f(x)。
所以 f ( x ) = ∏ i i [ f ( x ) = i ] f(x)=\prod\limits_{i}i^{[f(x)=i]} f(x)=i∏i[f(x)=i]
结论 #6
d ( n m ) = ∑ i ∣ n ∑ j ∣ m [ g c d ( i , j ) = 1 ] \operatorname{d}(nm) = \sum_{i|n}\sum_{j|m}[gcd(i,j)=1] d(nm)=i∣n∑j∣m∑[gcd(i,j)=1]
未完待续。
快速计算
当我们通过上面的结论推导出一个式子时,可以通过暴力计算得到答案。
但是显然,一般情况下,这样做时间复杂度较高。虽然已经比暴力算原式快了不少
所以我们可以通过预处理和前缀和或者其他方式(线段树动态维护等)来降低时间复杂度。
欧拉筛(线性筛)
可以 O ( n ) O(n) O(n) 时间内筛出大部分积性函数 [ 1 , n ] [1,n] [1,n] 的值。
线性筛 μ \mu μ
最常用的,就是筛莫比乌斯函数 μ \mu μ,因为一反演就基本上会用到 μ \mu μ。
μ \mu μ 为积性函数,所以若 g c d ( a , b ) = 1 gcd(a,b) = 1 gcd(a,b)=1,则 μ ( a b ) = μ ( a ) μ ( b ) \mu(ab)=\mu(a)\mu(b) μ(ab)=μ(a)μ(b)。
为了筛 μ \mu μ,我们考虑当 p p p 为质数时, μ ( p ) \mu(p) μ(p) 的取值。显然 μ ( p ) = − 1 \mu(p) = -1 μ(p)=−1。
那么再考虑当 p p p 为质数, p ∣ a p|a p∣a 时, μ ( a p ) \mu(ap) μ(ap) 和 μ ( a ) , μ ( p ) \mu(a),\mu(p) μ(a),μ(p) 的关系。显然由于 a a a 中已经包含质因子 p p p,所以 a p ap ap 的质因子 p p p 的幂一定大于等于 2 2 2。所以 μ ( a p ) = 0 \mu(ap) = 0 μ(ap)=0。
于是可以轻而易举的筛出 μ \mu μ。
线性筛
线性筛 ϕ \phi ϕ
未完待续。
例题
了解完如何运用莫比乌斯反演和预处理降低时间复杂度后,我们来做点例题。
未完待续。