一些 update
Update 2022/3/4:发现莫比乌斯反演中第二个式子推导时卷积式有误,导致结论错误,现已更正。
1. 前言
莫比乌斯函数与莫比乌斯反演是数论中的重要部分。
在一般做题的时候,需要整除分块,狄利克雷卷积,杜教筛等知识,以及根据不同的题目还会结合不同的算法。
莫比乌斯反演也有个简称叫莫反,后文会使用这个简称。
全文前置知识:整除分块,狄利克雷卷积。
2. 莫比乌斯函数
莫比乌斯函数的符号是 μ ( n ) \mu(n) μ(n),定义域是 N + \text{N}_+ N+,值域是 { 0 , 1 , − 1 } \{0,1,-1\} {0,1,−1},这个式子的计算方式如下:
- 定义 μ ( 1 ) = 1 \mu(1)=1 μ(1)=1。
- 对于 n ≥ 2 n \ge 2 n≥2,如果 n n n 能表示成 ∏ i = 1 k p i \prod_{i=1}^k p_i ∏i=1kpi 的形式,其中所有 p i p_i pi 都是质数,即分解质因数后指数均为 1,那么 μ ( n ) = ( − 1 ) k \mu(n)=(-1)^k μ(n)=(−1)k,否则 μ ( n ) = 0 \mu(n)=0 μ(n)=0。
从中可以发现,莫比乌斯函数类似于容斥系数。
另外的,莫比乌斯函数还有一种定义方式,是根据狄利克雷卷积得到的: I ∗ μ = ϵ I*\mu=\epsilon I∗μ=ϵ。
I I I 是常数函数, ϵ \epsilon ϵ 是单位函数, I ( n ) = 1 , ϵ ( n ) = [ n = 1 ] I(n)=1,\epsilon(n)=[n=1] I(n)=1,ϵ(n)=[n=1]。
因此上述的计算方式也是根据这个式子得到的。
性质:莫比乌斯函数是积性函数,即证明 ∀ gcd ( i , j ) = 1 , μ ( i ) × μ ( j ) = μ ( i × j ) \forall\gcd(i,j)=1,\mu(i) \times \mu(j)=\mu(i \times j) ∀gcd(i,j)=1,μ(i)×μ(j)=μ(i×j)。
一个函数 f ( n ) , n ∈ N + f(n),n \in \text{N}_+ f(n),n∈N+ 是积性函数的充要条件是 ∀ gcd ( i , j ) = 1 , f ( i ) × f ( j ) = f ( i × j ) \forall\gcd(i,j)=1,f(i) \times f(j)=f(i \times j) ∀gcd(i,j)=1,f(i)×f(j)=f(i×j)
证明:首先如果 i , j i,j i,j 中至少一个等于 1,原式必定成立。
对于所有 i , j ≥ 2 i,j \ge 2 i,j≥2,设 i = ∏ t = 1 s 1 p 1 , t k 1 , t , j = ∏ t = 1 s 2 p 2 , t k 2 , t i=\prod_{t=1}^{s_1}p_{1,t}^{k_{1,t}},j=\prod_{t=1}^{s_2}p_{2,t}^{k_{2,t}} i=∏t=1s1p1,tk1,t,j=∏t=1s2p2,tk2,t,其中 p n , m p_{n,m} pn,m 为质数,也就是分解质因数。
若 μ ( i ) \mu(i) μ(i) 与 μ ( j ) \mu(j) μ(j) 有至少一个为 0,也就说明所有 k n , m k_{n,m} kn,m 中有一个大于等于 2,因此 i × j i \times j i×j 也必然存在一个质数,其指数大于等于 2,则 μ ( i × j ) = 0 \mu(i \times j)=0 μ(i×j)=0,故原式成立。
若 μ ( i ) ≠ 0 , μ ( j ) ≠ 0 \mu(i) \ne 0,\mu(j) \ne 0 μ(i)=0,μ(j)=0,由于 gcd ( i , j ) = 1 \gcd(i,j)=1 gcd(i,j)=1,则所有 p n , m p_{n,m} pn,m 互不相同,也就是没有两个分解出来的质数是相同的,因此可以证明 i × j i \times j i×j 分解质因数之后没有一个质数,其指数大于等于 2。
现在可以将 i , j i,j i,j 化成这样: i = ∏ t = 1 s 1 p 1 , t , j = ∏ t = 1 s 2 p 2 , t i=\prod_{t=1}^{s_1}p_{1,t},j=\prod_{t=1}^{s_2}p_{2,t} i=∏t=1s1p1,t,j=∏t=1s2p2,t,则 i × j = ∏ t = 1 s p t i \times j=\prod_{t=1}^{s}p_t i×j=∏t=1spt,其中 s = s 1 + s 2 s=s_1+s_2 s=s1+s2, p t p_t pt 是由 p 1 , t p_{1,t} p1,t 和 p 2 , t p_{2,t} p2,t 并上的数列。
根据定义, μ ( i ) = ( − 1 ) s 1 , μ ( j ) = ( − 1 ) s 2 , μ ( i × j ) = ( − 1 ) s 1 + s 2 = μ ( i ) × μ ( j ) \mu(i)=(-1)^{s_1},\mu(j)=(-1)^{s_2},\mu(i \times j)=(-1)^{s_1+s_2}=\mu(i) \times \mu(j) μ(i)=(−1)s1,μ(j)=(−1)s2,μ(i×j)=(−1)s1+s2=μ(i)×μ(j),证毕。
既然 μ ( n ) \mu(n) μ(n) 是积性函数,那么我们可以线性筛求解 [ 1 , n ] ∩ N + [1,n]\cap\text{N}_+ [1,n]∩N+ 内所有的 μ ( i ) \mu(i) μ(i)。
Code:
void init()
{
mu[1] = 1; book[1] = 1; // 初始化
for (int i = 2; i <= n; ++i)
{
if (!book[i]) { Prime[++Prime[0]] = i; mu[i] = -1; }
// 质数默认为 -1
for (int j = 1; j <= Prime[0]; ++j)
{
if (i * Prime[j] > n) break ;
book[i * Prime[j]] = 1;
if (i % Prime[j] == 0) { mu[i * Prime[j]] = 0; break ; }
// 出现指数大于等于 2 的质数
mu[i * Prime[j]] = -mu[i];
// 考虑到 Prime[j] 自己是质数,因此直接转化成 -mu[i]
}
}
}
3. 莫比乌斯反演
再次说明:下文中莫反是莫比乌斯反演的简称。
首先证明一个性质: ∀ n ∈ N + , [ n = 1 ] = ∑ d ∣ n μ ( d ) \forall n \in \text{N}_+,[n=1]=\sum_{d\mid n}\mu(d) ∀n∈N+,[n=1]=∑d∣nμ(d)。
[ A ] [A] [A] 表示当 A A A 成立时值为 1,否则值为 0。
法一证明:
首先单独考虑 n = 1 n=1 n=1 的情况,此时带回原式验证发现等式显然成立。
对于 n ≥ 1 n \ge 1 n≥1 的情况,分解质因数, n = ∏ i = 1 s p i k i , d = ∏ i = 1 s ′ p i ′ n=\prod_{i=1}^{s}p_i^{k_i},d=\prod_{i=1}^{s'}p'_i n=∏i=1spiki,d=∏i=1s′pi′,这里不给 d d d 加指数的原因是对于指数大于等于 2 的数其 μ \mu μ 为 0。
发现此时计算 μ ( d ) \mu(d) μ(d) 就变成了一个组合问题,从 s s s 个质数中选出 s ′ s' s′ 个方案数 C s s ′ C_{s}^{s'} Css′,而这一块的 μ \mu μ 是 ( − 1 ) s ′ (-1)^{s'} (−1)s′,特别的, s ′ = 0 s'=0 s′=0 时意味着 d = 1 d=1 d=1。
因此 ∑ d ∣ n μ ( d ) = ∑ s ′ = 0 s C s s ′ ( − 1 ) s ′ \sum_{d \mid n}\mu(d)=\sum_{s'=0}^{s}C_{s}^{s'}(-1)^{s'} ∑d∣nμ(d)=∑s′=0sCss′(−1)s′
= ∑ s ′ = 0 s C s s ′ ( − 1 ) s ′ 1 s − s ′ =\sum_{s'=0}^{s}C_{s}^{s'}(-1)^{s'}1^{s-s'} =∑s′=0sCss′(−1)s′1s−s′
= ( ( − 1 ) + 1 ) s = 0 s =((-1)+1)^s=0^s =((−1)+1)s=0s。
上面两步运用的是二项式定理。
二项式定理: ( a + b ) n = ∑ i = 0 n C n i a i b n − i (a+b)^n=\sum_{i=0}^{n}C_n^ia^ib^{n-i} (a+b)n=∑i=0nCniaibn−i
因此,要证明的就是 [ n = 1 ] = 0 s [n=1]=0^s [n=1]=0s,而 n ≠ 1 n \ne 1 n=1,即证 0 s = 0 0^s=0 0s=0,又因为 n > 1 ⇒ s ≥ 1 ⇒ 0 s = 0 n>1 \Rightarrow s \ge 1 \Rightarrow 0^s=0 n>1⇒s≥1⇒0s=0,因此原式得证, n ≥ 2 n \ge 2 n≥2 部分证毕。
综上,所求证明式 [ n = 1 ] = ∑ d ∣ n μ ( d ) [n=1]=\sum_{d \mid n}\mu(d) [n=1]=∑d∣nμ(d) 成立。
得到这个之后,我们考虑将 n n n 替换成 gcd ( i , j ) \gcd(i,j) gcd(i,j),原式同样成立,得到:
[ gcd ( i , j ) = 1 ] = ∑ d ∣ gcd ( i , j ) μ ( d ) [\gcd(i,j)=1]=\sum_{d \mid \gcd(i,j)}\mu(d) [gcd(i,j)=1]=d∣gcd(i,j)∑μ(d)
法二:直接根据 I ∗ μ = ϵ I*\mu=\epsilon I∗μ=ϵ,展开即可。
这个式子就是莫反的一个重要结论,注意一下这不是正经的莫反,只是个结论。
这个式子的好处在于碰到一些跟 gcd \gcd gcd 有关的式子时,如果使用正经的莫反需要另设两个函数,但是直接使用这个式子可以将 gcd \gcd gcd 转化成对 μ ( d ) \mu(d) μ(d) 的一种特殊求和,然后采用枚举 d d d 的方式提出求和符号,从而解决问题。
本结论对应可以解决例题 1。
接下来推正经莫反的式子,不会狄利克雷卷积的自行出门学习。
我们设 g = f ∗ I g=f*I g=f∗I,因为 f = f ∗ ϵ , ϵ = I ∗ μ f=f*\epsilon,\epsilon=I*\mu f=f∗ϵ,ϵ=I∗μ,所以 f = f ∗ I ∗ μ = g ∗ μ f=f*I*\mu=g*\mu f=f∗I∗μ=g∗μ。
将狄利克雷卷积拆掉,就得到了莫反的第一个式子:
g ( n ) = ∑ d ∣ n f ( d ) ⇒ f ( n ) = ∑ d ∣ n g ( d ) μ ( n d ) g(n)=\sum_{d \mid n}f(d)\Rightarrow f(n)=\sum_{d \mid n}g(d)\mu(\dfrac{n}{d}) g(n)=d∣n∑f(d)⇒f(n)=d∣n∑g(d)μ(dn)
另外还有一个比较常用的式子:
新定义一种卷积 f ⊕ g f\oplus g f⊕g(此处的 ⊕ \oplus ⊕ 是一种符号,不是异或), t = f ⊕ g ⇒ t ( d ) = ∑ d ∣ n f ( n ) g ( n d ) t=f\oplus g \Rightarrow t(d)=\sum_{d \mid n}f(n)g(\dfrac{n}{d}) t=f⊕g⇒t(d)=∑d∣nf(n)g(dn)。
模仿狄利克雷卷积,我们令 g = f ⊕ I g=f\oplus I g=f⊕I,易证 f = f ⊕ ϵ , ϵ = I ⊕ μ f=f\oplus \epsilon,\epsilon=I \oplus \mu f=f⊕ϵ,ϵ=I⊕μ 依然成立,所以 f = f ⊕ ϵ = f ⊕ I ⊕ μ = g ⊕ μ f=f\oplus\epsilon=f\oplus I\oplus\mu=g \oplus \mu f=f⊕ϵ=f⊕I⊕μ=g⊕μ。
注意上述过程中需要证明结合律也是成立的。
然后拆掉式子,就得到了莫反的第二个式子:
g ( d ) = ∑ d ∣ n f ( n ) ⇒ f ( d ) = ∑ d ∣ n g ( n ) μ ( n d ) g(d)=\sum_{d \mid n}f(n)\Rightarrow f(d)=\sum_{d \mid n}g(n)\mu(\dfrac{n}{d}) g(d)=d∣n∑f(n)⇒f(d)=d∣n∑g(n)μ(dn)
这两个式子可以对应解决例题 2。
4. 例题
因为是新学的,所以推式子会推的尽量详细,每一步都会推到位。
例题 1:给出 k ≤ n ≤ m ≤ 1 0 5 k \leq n \leq m \leq 10^5 k≤n≤m≤105,求下列式子的值: ∑ i = 1 n ∑ j = 1 m [ gcd ( i , j ) = k ] \sum_{i=1}^{n}\sum_{j=1}^{m}[\gcd(i,j)=k] ∑i=1n∑j=1m[gcd(i,j)=k],多组数据,数据组数 T ≤ 1 0 5 T \leq 10^5 T≤105。
套路式的把 k k k 从 gcd \gcd gcd 中丢掉,变成 ∑ i = 1 ⌊ n k ⌋ ∑ j = 1 ⌊ m k ⌋ [ gcd ( i , j ) = 1 ] \sum_{i=1}^{\lfloor\frac{n}{k}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{k}\rfloor}[\gcd(i,j)=1] ∑i=1⌊kn⌋∑j=1⌊km⌋[gcd(i,j)=1]。
然后套上我们推出来的式子: [ gcd ( i , j ) = 1 ] = ∑ d ∣ gcd ( i , j ) μ ( d ) [\gcd(i,j)=1]=\sum_{d \mid \gcd(i,j)}\mu(d) [gcd(i,j)=1]=∑d∣gcd(i,j)μ(d)
原式变成 ∑ i = 1 ⌊ n k ⌋ ∑ j = 1 ⌊ m k ⌋ ∑ d ∣ gcd ( i , j ) μ ( d ) \sum_{i=1}^{\lfloor\frac{n}{k}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{k}\rfloor}\sum_{d \mid \gcd(i,j)}\mu(d) ∑i=1⌊kn⌋∑j=1⌊km⌋∑d∣gcd(i,j)μ(d)。
考虑提前枚举 d d d,变成 ∑ d = 1 ⌊ n k ⌋ ∑ i = 1 ⌊ n k ⌋ ∑ j = 1 ⌊ m k ⌋ μ ( d ) × [ d ∣ gcd ( i , j ) ] \sum_{d=1}^{\lfloor\frac{n}{k}\rfloor}\sum_{i=1}^{\lfloor\frac{n}{k}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{k}\rfloor}\mu(d) \times [d \mid \gcd(i,j)] ∑d=1⌊kn⌋∑i=1⌊kn⌋∑j=1⌊km⌋μ(d)×[d∣gcd(i,j)]。
然后将 μ ( d ) \mu(d) μ(d) 提前,变成 ∑ d = 1 ⌊ n k ⌋ μ ( d ) ∑ i = 1 ⌊ n k ⌋ ∑ j = 1 ⌊ m k ⌋ [ d ∣ gcd ( i , j ) ] \sum_{d=1}^{\lfloor\frac{n}{k}\rfloor}\mu(d)\sum_{i=1}^{\lfloor\frac{n}{k}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{k}\rfloor}[d \mid \gcd(i,j)] ∑d=1⌊kn⌋μ(d)∑i=1⌊kn⌋∑j=1⌊km⌋[d∣gcd(i,j)]。
再转换,变成 ∑ d = 1 ⌊ n k ⌋ μ ( d ) ∑ i = 1 ⌊ n k ⌋ [ d ∣ i ] ∑ j = 1 ⌊ m k ⌋ [ d ∣ j ] \sum_{d=1}^{\lfloor\frac{n}{k}\rfloor}\mu(d)\sum_{i=1}^{\lfloor\frac{n}{k}\rfloor}[d \mid i]\sum_{j=1}^{\lfloor\frac{m}{k}\rfloor}[d \mid j] ∑d=1⌊kn⌋μ(d)∑i=1⌊kn⌋[d∣i]∑j=1⌊km⌋[d∣j]。
若 d ∣ gcd ( i , j ) d \mid \gcd(i,j) d∣gcd(i,j),则 [ d ∣ gcd ( i , j ) ] = [ d ∣ i ] × [ d ∣ j ] [d \mid \gcd(i,j)]=[d \mid i] \times [d \mid j] [d∣gcd(i,j)]=[d∣i]×[d∣j]。
于是式子变成 ∑ d = 1 ⌊ n k ⌋ μ ( d ) × ⌊ n k d ⌋ × ⌊ m k d ⌋ \sum_{d=1}^{\lfloor\frac{n}{k}\rfloor}\mu(d) \times \lfloor\dfrac{n}{kd}\rfloor\times\lfloor\dfrac{m}{kd}\rfloor ∑d=1⌊kn⌋μ(d)×⌊kdn⌋×⌊kdm⌋。
此处运用的式子: ∑ i = 1 n [ d ∣ i ] = ⌊ n d ⌋ \sum_{i=1}^{n}[d \mid i]=\lfloor\dfrac{n}{d}\rfloor ∑i=1n[d∣i]=⌊dn⌋。
然后利用整除分块在 O ( n k ) O(\sqrt{\dfrac{n}{k}}) O(kn) 时间内解决单组数据,总复杂度 O ( n + t n k ) O(n+t\sqrt{\dfrac{n}{k}}) O(n+tkn)。
得到这个之后,套上一个差分便可以解决这道题:P2522 [HAOI2011]Problem b。
例题 2:给定 n ≤ m ≤ 1 0 6 n\le m \le 10^6 n≤m≤106 和数列 { f i } \{f_i\} {fi},求下列式子的值,多组数据,数据组数 t ≤ 1 0 4 t \le 10^4 t≤104:
∑ i = 1 n ∑ j = 1 m f gcd ( i , j ) \sum_{i=1}^{n}\sum_{j=1}^{m}f_{\gcd(i,j)} i=1∑nj=1∑mfgcd(i,j)
首先有一个式子: g ( gcd ( a , b ) ) = ∑ d ∣ gcd ( a , b ) f ( d ) = ∑ d ∣ a , d ∣ b f ( d ) g(\gcd(a,b))=\sum_{d \mid \gcd(a,b)}f(d)=\sum_{d \mid a,d \mid b}f(d) g(gcd(a,b))=∑d∣gcd(a,b)f(d)=∑d∣a,d∣bf(d)。
也就是 g = I ∗ f g=I*f g=I∗f 的时候有上述式子。
考虑我们已经知道了一个 g = I ∗ f g=I*f g=I∗f,那么原式等于 ∑ i = 1 n ∑ j = 1 m ∑ d ∣ a , d ∣ b g ( d ) \sum_{i=1}^{n}\sum_{j=1}^{m}\sum_{d\mid a,d\mid b}g(d) ∑i=1n∑j=1m∑d∣a,d∣bg(d)
= ∑ d = 1 n g ( d ) ∑ i = 1 n ∑ j = 1 m [ d ∣ i ] [ d ∣ j ] =\sum_{d=1}^{n}g(d)\sum_{i=1}^{n}\sum_{j=1}^m[d \mid i][d \mid j] =∑d=1ng(d)∑i=1n∑j=1m[d∣i][d∣j](注意 n ≤ m n \le m n≤m)
= ∑ d = 1 n g ( d ) × ⌊ n d ⌋ × ⌊ m d ⌋ =\sum_{d=1}^ng(d)\times\lfloor\dfrac{n}{d}\rfloor\times\lfloor\dfrac{m}{d}\rfloor =∑d=1ng(d)×⌊dn⌋×⌊dm⌋。
然后整除分块即可。
至于 g g g,直接根据 f = I ∗ g ⇒ g = f ∗ μ f=I*g\Rightarrow g=f*\mu f=I∗g⇒g=f∗μ 求解即可。
5. 总结
莫比乌斯函数定义: I ∗ μ = ϵ I*\mu=\epsilon I∗μ=ϵ。
计算方式:
- 定义 μ ( 1 ) = 1 \mu(1)=1 μ(1)=1。
- 对于 n ≥ 2 n \ge 2 n≥2,如果 n n n 能表示成 ∏ i = 1 k p i \prod_{i=1}^k p_i ∏i=1kpi 的形式,其中所有 p i p_i pi 都是质数,即分解质因数后指数均为 1,那么 μ ( n ) = ( − 1 ) k \mu(n)=(-1)^k μ(n)=(−1)k,否则 μ ( n ) = 0 \mu(n)=0 μ(n)=0。
三个重要式子:
[ gcd ( i , j ) = 1 ] = ∑ d ∣ gcd ( i , j ) μ ( d ) [\gcd(i,j)=1]=\sum_{d \mid \gcd(i,j)}\mu(d) [gcd(i,j)=1]=d∣gcd(i,j)∑μ(d)
g ( n ) = ∑ d ∣ n f ( d ) ⇒ f ( n ) = ∑ d ∣ n g ( d ) μ ( n d ) g(n)=\sum_{d \mid n}f(d)\Rightarrow f(n)=\sum_{d \mid n}g(d)\mu(\dfrac{n}{d}) g(n)=d∣n∑f(d)⇒f(n)=d∣n∑g(d)μ(dn)
g ( n ) = ∑ d ∣ n f ( n ) ⇒ f ( n ) = ∑ d ∣ n g ( n ) μ ( n d ) g(n)=\sum_{d \mid n}f(n)\Rightarrow f(n)=\sum_{d \mid n}g(n)\mu(\dfrac{n}{d}) g(n)=d∣n∑f(n)⇒f(n)=d∣n∑g(n)μ(dn)
后面我会专门写一篇博文,简单写下莫比乌斯函数与欧拉函数在狄利克雷卷积之下有什么好用的性质。