为啥学习莫比乌斯反演?是因为最近 CF 连着两次莫反让我感觉到自己没有力量。
大概是复读一下题解的话再加上一点自己的理解。
前置知识和引理:
数论分块:
不想写了,反正都2021年了大家肯定都会了。
二项式定理:
( a + b ) n = ∑ i = 0 n C n i a n − i b i (a+b)^n=\sum\limits_{i=0}^{n} C_{n}^{i}a^{n-i}b^i (a+b)n=i=0∑nCnian−ibi。
引理 1:
∀ a , b , c ∈ z ⌊ a b c ⌋ = ⌊ ⌊ a b ⌋ c ⌋ \forall{a,b,c \in \mathbb{z}} \quad \lfloor \frac{a}{bc} \rfloor= \lfloor\frac{\lfloor \frac{a}{b} \rfloor}{c}\rfloor ∀a,b,c∈z⌊bca⌋=⌊c⌊ba⌋⌋
证明: ⌊ a b c ⌋ = ⌊ a b × 1 c ⌋ \lfloor \frac{a}{bc} \rfloor=\lfloor \frac{a}{b}\times \frac{1}{c} \rfloor ⌊bca⌋=⌊ba×c1⌋。
令 ⌊ a b ⌋ = a b − d \lfloor \frac{a}{b}\rfloor=\frac{a}{b}-d ⌊ba⌋=ba−d。
⌊ a b × 1 c ⌋ = ⌊ ( ⌊ a b ⌋ + d ) × 1 c ⌋ = ⌊ ⌊ a b ⌋ c + d c ⌋ = ⌊ ⌊ a b ⌋ c ⌋ \lfloor \frac{a}{b}\times \frac{1}{c} \rfloor=\lfloor (\lfloor \frac{a}{b}\rfloor+d)\times \frac{1}{c} \rfloor=\lfloor \frac{\lfloor\frac{a}{b}\rfloor}{c} + \frac{d}{c} \rfloor=\lfloor\frac{\lfloor \frac{a}{b} \rfloor}{c}\rfloor ⌊ba×c1⌋=⌊(⌊ba⌋+d)×c1⌋=⌊c⌊ba⌋+cd⌋=⌊c⌊ba⌋⌋。
Q . E . D Q.E.D Q.E.D
引理 2:
对于给定的 N ∈ N + N\in \mathbb{N_+} N∈N+,对于任意的 d ∈ N + d \in \mathbb{N_+} d∈N+, ⌊ N d ⌋ \lfloor \frac{N}{d} \rfloor ⌊dN⌋ 最多有 ⌊ 2 N ⌋ \lfloor2\sqrt N\rfloor ⌊2N⌋ 种取值。
证明:当 d ≤ N d \le \sqrt N d≤N 时, ⌊ N d ⌋ \lfloor \frac{N}{d} \rfloor ⌊dN⌋ 显然最多有 N \sqrt N N 种取值。
当 d > N d > \sqrt N d>N,易得最多有 N \sqrt N N 种取值。
Q . E . D Q.E.D Q.E.D
引理 2 其实就是数论分块复杂度的证明。
积性函数
定义
若函数 f ( n ) f(n) f(n) 满足 f ( 1 ) = 1 f(1)=1 f(1)=1, ∀ x , y ∈ N + ( g c d ( x , y ) = 1 ) , f ( x y ) = f ( x ) f ( y ) \forall x,y\in \mathbb{N_+}(gcd(x,y)=1),f(xy)=f(x)f(y) ∀x,y∈N+(gcd(x,y)=1),f(xy)=f(x)f(y),则称其为积性函数。
e.g:
欧拉函数 ϕ ( x ) = ∑ i = 1 n [ g c d ( i , x ) = 1 ] \phi(x)=\sum\limits_{i=1}^n[gcd(i,x)=1] ϕ(x)=i=1∑n[gcd(i,x)=1]。
除数函数 σ k ( x ) = ∑ d ∣ n d k \sigma_k(x)=\sum\limits_{d|n} d^k σk(x)=d∣n∑dk。特别的我们记 σ 0 ( x ) = τ ( x ) \sigma_0(x)=\tau(x) σ0(x)=τ(x) 或者 d ( x ) d(x) d(x)。
若函数 f ( n ) f(n) f(n) 满足 f ( 1 ) = 1 f(1)=1 f(1)=1, ∀ x , y ∈ N + , f ( x y ) = f ( x ) f ( y ) \forall x,y\in \mathbb{N_+},f(xy)=f(x)f(y) ∀x,y∈N+,f(xy)=f(x)f(y),则称其为完全积性函数。
备注:其实 f ( 1 ) = 1 f(1)=1 f(1)=1 是一个多余的东西,因为 f ( 1 ) = f ( 1 ) f ( 1 ) f(1)=f(1)f(1) f(1)=f(1)f(1)
e.g:
常数函数 I ( n ) = 1 I(n)=1 I(n)=1。
狄利克雷卷积
对于 f ( x ) , g ( x ) f(x),g(x) f(x),g(x) 两个函数(注意不一定是积性函数)它们的狄利克雷卷积写作 f ∗ g f * g f∗g,这个 f ∗ g f*g f∗g 就是卷出来的新函数的名称。
( f ∗ g ) ( n ) = ∑ d ∣ n f ( d ) g ( x d ) = ∑ x y = n f ( x ) g ( y ) (f*g)(n)=\sum\limits_{d|n} f(d)g(\frac{x}{d})=\sum\limits_{xy=n}f(x)g(y) (f∗g)(n)=d∣n∑f(d)g(dx)=xy=n∑f(x)g(y)
那么有
交换律: f ∗ g = g ∗ f f*g=g*f f∗g=g∗f
结合律: f ∗ ( g ∗ h ) = ( f ∗ g ) ∗ h f*(g*h)=(f*g)*h f∗(g∗h)=(f∗g)∗h
然后再介绍一个函数 ϵ ( x ) = [ x = 1 ] \epsilon(x)=[x=1] ϵ(x)=[x=1],这个函数有性质: ϵ ∗ f = f \epsilon*f=f ϵ∗f=f,可以看做卷积中的单位元(所以又叫做元函数)。
积性函数的性质
若 f 1 ( x ) f1(x) f1(x) 和 f 2 ( x ) f2(x) f2(x) 都是积性函数,那么以下函数也都是积性函数:
h ( x ) = f 1 ( x p ) h(x)=f1(x^p) h(x)=f1(xp)
h ( x ) = f 1 p ( x ) = f 1 p − 1 ∗ f 1 h(x)=f1^p(x)=f1^{p-1}*f1 h(x)=f1p(x)=f1p−1∗f1
h ( x ) = f 1 ( x ) ∗ f 2 ( x ) h(x)=f1(x)*f2(x) h(x)=f1(x)∗f2(x)
h ( x ) = ∑ d ∣ n f 1 ( d ) f 2 ( x d ) h(x)=\sum\limits_{d|n} f1(d)f2(\frac{x}{d}) h(x)=d∣n∑f1(d)f2(dx)
f ( x ) = f ( p 1 k 1 ) ∗ f ( p 2 k 2 ) ∗ . . . ∗ f ( p m k m ) ( x = p 1 k 1 p 2 k 2 . . . p m k m , i s p r i m e ( p i ) = 1 ) f(x)=f({p_1}^{k_1})*f({p_2}^{k_2})*...*f({p_m}^{k_m})(x={p_1}^{k_1}{p_2}^{k_2}...{p_m}^{k_m},isprime(p_i)=1) f(x)=f(p1k1)∗f(p2k2)∗...∗f(pmkm)(x=p1k1p2k2...pmkm,isprime(pi)=1)。
积性函数的逆也是积性函数(什么是函数的逆,对于函数 f f f,若存在函数 g g g 使得 f ∗ g = ϵ f*g=\epsilon f∗g=ϵ,就说 g g g 是 f f f 的逆(是不是有点像逆元的定义))
证明:不存在的
关于函数的逆,还有一点东西:
- 如何去构造函数的逆:先给出结论,只要 f ( 1 ) ≠ 0 f(1) \neq 0 f(1)=0,那么 f f f 存在逆 g g g。
首先, ( f ∗ g ) ( n ) = ∑ d ∣ n f ( d ) g ( n d ) (f*g)(n)=\sum\limits_{d|n} f(d)g(\frac{n}{d}) (f∗g)(n)=d∣n∑f(d)g(dn),把 d = 1 d=1 d=1 拆出来,得 ∑ d ∣ n , d ≠ 1 f ( d ) g ( n d ) + f ( 1 ) g ( n ) \sum\limits_{d|n,d≠1}f(d)g(\frac{n}{d})+f(1)g(n) d∣n,d=1∑f(d)g(dn)+f(1)g(n)。
然后,我们递归构造 g ( n ) = ( e − ∑ d ∣ n , d ≠ 1 f ( d ) g ( n d ) ) f ( 1 ) g(n)=\frac{\left(e-\sum\limits_{d|n,d≠1}f(d)g(\frac{n}{d})\right)}{f(1)} g(n)=f(1)(e−d∣n,d=1∑f(d)g(dn))。
带入上式得到 ∑ d ∣ n , d ≠ 1 f ( d ) g ( n d ) + f ( 1 ) ( e − ∑ d ∣ n , d ≠ 1 f ( d ) g ( n d ) ) f ( 1 ) = e \sum\limits_{d|n,d≠1}f(d)g(\frac{n}{d})+f(1)\frac{\left(e-\sum\limits_{d|n,d≠1}f(d)g(\frac{n}{d})\right)}{f(1)}=e d∣n,d=1∑f(d)g(dn)+f(1)f(1)(e−d∣n,d=1∑f(d)g(dn))=e。
即构造出了 f f f 的逆 g g g。但是注意到 f ( 1 ) ≠ 0 f(1) \neq 0 f(1)=0。
从某种意义上前置知识已经结束了
莫比乌斯反演
莫比乌斯函数
先随便写点东西。
现在有这么两个函数 F F F 和 f f f。
假定有:
F ( n ) = ∑ d ∣ n f ( d ) F(n)=\sum\limits_{d|n}f(d) F(n)=d∣n∑f(d)。
如果你理解了卷积的概念:不难得到:
F
(
n
)
=
∑
d
∣
n
(
1
∗
f
(
d
)
)
F(n)=\sum\limits_{d|n}(1 * f(d))
F(n)=d∣n∑(1∗f(d))
=
∑
d
∣
n
(
I
(
n
d
)
∗
f
(
d
)
)
=\sum\limits_{d|n}(I(\frac{n}{d})*f(d))
=d∣n∑(I(dn)∗f(d)),其中
I
(
d
)
=
1
I(d)=1
I(d)=1
=
I
∗
f
=I * f
=I∗f。
于是我们把 F F F 函数写成了卷积的形式。
有什么好处呢?
如果知道 f f f 函数,我们就可以得到 F F F 函数。
那么…如果我们知道 F F F 函数呢?
那我们就要写成
f
=
.
.
.
f=...
f=... 的形式,两边同乘
I
−
1
I^{-1}
I−1,可得
f
=
F
∗
I
−
1
f=F*I^{-1}
f=F∗I−1
所以
I
−
1
I^{-1}
I−1 是个什么东西???这个时候大佬莫比乌斯站出来说,
I
−
1
=
μ
I^{-1}=\mu
I−1=μ 。
大家知道
I
I
I 是个积性函数,
I
∗
I
−
1
=
ϵ
I * I^{-1}=\epsilon
I∗I−1=ϵ,所以
I
−
1
I^{-1}
I−1 也是个积性函数。
研究一个积性函数,先研究其在质数的幂时的表现。——command_block
μ ( p 0 ) = 1 \mu(p^0)=1 μ(p0)=1(显然)
μ ( p 1 ) \mu(p^1) μ(p1) 怎么计算呢?注意到 ϵ ( p ) = ( μ ∗ I ) ( p ) \epsilon(p)=(\mu*I)(p) ϵ(p)=(μ∗I)(p)
ϵ
(
p
)
=
∑
d
∣
p
μ
(
d
)
I
(
p
d
)
\epsilon(p)=\sum\limits_{d|p}\mu(d)I(\frac{p}{d})
ϵ(p)=d∣p∑μ(d)I(dp)
=
∑
d
∣
p
μ
(
d
)
=\sum\limits_{d|p}\mu(d)
=d∣p∑μ(d)
好像原地踏步了…?注意到 p p p 是个质数。
ϵ ( p ) = μ ( 1 ) + μ ( p ) \epsilon(p)=\mu(1)+\mu(p) ϵ(p)=μ(1)+μ(p)
由于 p > 1 p>1 p>1
0 = 1 + μ ( p ) 0=1+\mu(p) 0=1+μ(p)
得到 μ ( p ) = − 1 \mu(p)=-1 μ(p)=−1
接着我们来看 μ ( p k ) \mu(p^k) μ(pk) 怎么算。
还是套用刚才的卷积形式:
ϵ ( p k ) = ∑ d ∣ p μ ( d ) I ( p k d ) \epsilon(p^k)=\sum\limits_{d|p}\mu(d)I(\frac{p^k}{d}) ϵ(pk)=d∣p∑μ(d)I(dpk)
再次去考虑 d d d 的取值,会发现 d = p 0 , p 1 . . . p k d=p^0,p^1...p^k d=p0,p1...pk 这些东西。
ϵ ( p k ) = μ ( p 0 ) I ( p k ) + μ ( p 1 ) I ( p k − 1 ) . . . + μ ( p k ) I ( p 0 ) \epsilon(p^k)=\mu(p^0)I(p^k)+\mu(p^1)I(p^{k-1})...+\mu(p^k)I(p^0) ϵ(pk)=μ(p0)I(pk)+μ(p1)I(pk−1)...+μ(pk)I(p0)
ϵ ( p k ) = ∑ i = 0 k μ ( p i ) = 0 \epsilon(p^k)=\sum\limits_{i=0}^{k}\mu(p^i)=0 ϵ(pk)=i=0∑kμ(pi)=0
那么可以得到: μ ( p k ) = 0 ( k > 1 ) \mu(p^k)=0(k>1) μ(pk)=0(k>1)。
当我们研究完了这个东西,注意到积性函数的一个性质:
f ( x ) = f ( p 1 k 1 ) ∗ f ( p 2 k 2 ) ∗ . . . ∗ f ( p m k m ) f(x)=f({p_1}^{k_1})*f({p_2}^{k_2})*...*f({p_m}^{k_m}) f(x)=f(p1k1)∗f(p2k2)∗...∗f(pmkm)。
那就不难想到如果有一个 k i > 1 k_i >1 ki>1, μ ( x ) \mu(x) μ(x) 就等于 0 0 0,而其他情况 μ ( x ) = ± 1 \mu(x)=\pm1 μ(x)=±1。具体的:
μ ( n ) = { 0 d ∈ N + , d ≠ 1 , d 2 ∣ n ( − 1 ) ∑ d ∣ n ( i s p r i m e ( d ) = 1 ) other \mu(n) = \begin{cases} 0 & {d \in{\mathbb{N_+,d\neq1,d^2|n}}} \\ (-1)^{\sum\limits_{d|n}(isprime(d)=1)} & \text{other} \end{cases} μ(n)=⎩⎨⎧0(−1)d∣n∑(isprime(d)=1)d∈N+,d=1,d2∣nother
说人话就是若 n n n 存在一个大于 1 1 1 的平方因子,那么 μ ( n ) = 0 \mu(n)=0 μ(n)=0,否则就是 − 1 -1 −1 的 k k k 次方,其中 k k k 表示 n n n 的质因数种类数。
既然知道了这些,作为一个臭名昭著著名的积性函数,它和欧拉函数一样可以筛出来:
void Mobius()
{
e[1]=1;mu[1]=1;
for (int i=2;i<=n;i++){
if (!e[i]){p[++tn]=i;mu[i]=-1;}
for (int j=1;j<=tn;j++){
if (p[j]*i>n)break;
mu[p[j]*i]=i%p[j]==0 ? 0 : -mu[i];
e[p[j]*i]=1;
if (i%p[j]==0)break;
}
}
}
(转自 command_block,有时间再补自己的)
莫比乌斯反演
终于…
嵌入式莫比乌斯反演
由 μ ∗ I = ϵ \mu*I=\epsilon μ∗I=ϵ
得 ∑ d ∣ n μ ( d ) = [ n = 1 ] \sum\limits_{d|n}\mu(d)=[n=1] d∣n∑μ(d)=[n=1]
然后:
[ n ∣ m ] [ n / m = 1 ] = [ n = m ] [n|m][n/m=1]=[n=m] [n∣m][n/m=1]=[n=m]
[ n ∣ m ] ∑ d ∣ ( n / m ) μ ( d ) = [ n = m ] [n|m]\sum\limits_{d|(n/m)}\mu(d)=[n=m] [n∣m]d∣(n/m)∑μ(d)=[n=m]
这个东西有什么用呢?来看这样一道题:
求 ∑ i = 1 n ∑ j = 1 m [ g c d ( i , j ) = 1 ] \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}[gcd(i,j)=1] i=1∑nj=1∑m[gcd(i,j)=1]
我们把 g c d ( i , j ) gcd(i,j) gcd(i,j) 看成一个东西。
∑ d ∣ g c d ( i , j ) μ ( d ) = [ g c d ( i , j ) = 1 ] \sum\limits_{d|gcd(i,j)}\mu(d)=[gcd(i,j)=1] d∣gcd(i,j)∑μ(d)=[gcd(i,j)=1]
考虑什么是 d ∣ g c d ( i , j ) d|gcd(i,j) d∣gcd(i,j),也就是说 d ∣ i d|i d∣i 且 d ∣ j d|j d∣j。
所以题目所求变为了 ∑ i = 1 n ∑ j = 1 m ∑ d ∣ i , d ∣ j μ ( d ) \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}\sum\limits_{d|i,d|j}\mu(d) i=1∑nj=1∑md∣i,d∣j∑μ(d)。
考虑变换求和顺序,注意到 ∑ d ∣ g c d ( i , j ) μ ( d ) = ϵ ≤ 1 \sum\limits_{d|gcd(i,j)}\mu(d)=\epsilon\le1 d∣gcd(i,j)∑μ(d)=ϵ≤1,所以可以改成 ∑ d = 1 d = n μ ( d ) × ∑ i = 1 , d ∣ i m ∑ j = 1 , d ∣ j n 1 \sum\limits_{d=1}^{d=n}\mu(d)\times\sum\limits_{i=1,d|i}^{m}\sum\limits_{j=1,d|j}^{n}1 d=1∑d=nμ(d)×i=1,d∣i∑mj=1,d∣j∑n1。
是不是逐渐可做了?注意到每个 ⌊ n i ⌋ \lfloor \frac{n}{i} \rfloor ⌊in⌋ 都只有一个满足条件( j j j 同理),这个式子等价于 ∑ d = 1 d = n μ ( d ) × [ n / d ] [ m / d ] \sum\limits_{d=1}^{d=n}\mu(d)\times[n/d][m/d] d=1∑d=nμ(d)×[n/d][m/d]
这个向下取整的形式很类似于整除分块,我们看看怎么用整除分块维护,若确定了一段 d d d 后面两项的取值是相同的,可以 ( n ) (\sqrt n) (n) 计算,但是 μ ( i ) \mu(i) μ(i) 怎么办?记录个前缀和就好了嘛!
也许这道题并不能看出数论分块的优秀复杂度,但是后面就能看出来了。
例题:
洛谷 P1390 公约数的和
题意:求 ∑ i = 1 n ∑ j = i + 1 m g c d ( i , j ) \sum\limits_{i=1}^{n}\sum\limits_{j=i+1}^{m}gcd(i,j) i=1∑nj=i+1∑mgcd(i,j)
这里介绍一个莫凡常用技巧:枚举 gcd,我们设 g c d ( i , j ) = g gcd(i,j)=g gcd(i,j)=g
当前的问题转化成求: ∑ i = 1 n ∑ j = i + 1 m ( g c d ( i , j ) = d ) \sum\limits_{i=1}^{n}\sum\limits_{j=i+1}^{m}(gcd(i,j)=d) i=1∑nj=i+1∑m(gcd(i,j)=d)
我们先考虑怎么计算 ∑ i = 1 n ∑ j = 1 m ( g c d ( i , j ) = g ) \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}(gcd(i,j)=g) i=1∑nj=1∑m(gcd(i,j)=g)
这个东西是个套路,把这东西换成是 i , j i,j i,j 互质,这样 g c d ( g i , g j ) gcd(gi,gj) gcd(gi,gj) 就可以一定是 g g g。原式改成 ∑ i = 1 ⌊ n g ⌋ ∑ j = 1 ⌊ m g ⌋ ( g c d ( i , j ) = 1 ) \sum\limits_{i=1}^{\lfloor \frac{n}{g}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{m}{g}\rfloor}(gcd(i,j)=1) i=1∑⌊gn⌋j=1∑⌊gm⌋(gcd(i,j)=1)这东西大家都很熟了,直接改成重复上面的过程:
∑ i = 1 ⌊ n g ⌋ ∑ j = 1 ⌊ m g ⌋ ∑ d ∣ i , d ∣ j μ ( d ) \sum\limits_{i=1}^{\lfloor \frac{n}{g}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{m}{g}\rfloor}\sum\limits_{d | i,d|j}\mu(d) i=1∑⌊gn⌋j=1∑⌊gm⌋d∣i,d∣j∑μ(d)
∑ d = 1 m i n ( ⌊ n d ⌋ , ⌊ m d ⌋ ) μ ( d ) [ ⌊ ⌊ n g ⌋ d ⌋ ] [ ⌊ ⌊ m g ⌋ d ⌋ ] \sum\limits_{d=1}^{min(\lfloor \frac{n}{d}\rfloor,\lfloor \frac{m}{d}\rfloor)}\mu(d)[\lfloor\frac{\lfloor \frac{n}{g}\rfloor}{d}\rfloor][\lfloor\frac{\lfloor \frac{m}{g}\rfloor}{d}\rfloor] d=1∑min(⌊dn⌋,⌊dm⌋)μ(d)[⌊d⌊gn⌋⌋][⌊d⌊gm⌋⌋]
然后还要删去多算的东西,也就是:
∑ i = 1 n ∑ j = 1 m a x ( i , ⌊ m g ⌋ ) g c d ( i , j ) = 1 \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{max(i,\lfloor\frac{m}{g}\rfloor)} gcd(i,j)=1 i=1∑nj=1∑max(i,⌊gm⌋)gcd(i,j)=1
同样反演。
然后数论分块一下,预处理一下前缀和就好了(