莫比乌斯反演的理论与实践

2020-12-14 凌晨

已经开始美好大学生活的我,重温了一下曾经熟悉的题目,霎时间,眼圈红了。我爱 OI,OI是我一生为之奋斗的信仰。

老版前言

2017 CDQZ 联训 中向 HSZX 的大佬请教了一些关于莫反的知识,特此感谢!

本文仅介绍一些关于莫比乌斯反演的基础知识。

声明

本文中,若无特殊声明 p 1 a 1 ⋅ p 2 a 2 ⋅ . . . ⋅ P k a k p_1^{a_1} \cdot p_2^{a_2} \cdot ... \cdot P_k^{a_k} p1a1p2a2...Pkak表示一个数的质因数分解, ∀ i , p r i m e ( p i ) ∧ a i ∈ N + \forall i, prime(p_i) \land a_i \in N^{+} i,prime(pi)aiN+

莫比乌斯函数

定义

莫比乌斯函数是在数论中一个很重要的积性函数,定义如下。

若正整数x可质因数分解为:

x = p 1 a 1 ⋅ p 2 a 2 ⋅ . . . ⋅ P k a k x=p_1^{a_1} \cdot p_2^{a_2} \cdot ... \cdot P_k^{a_k} x=p1a1p2a2...Pkak

μ ( x ) = { 0 : ∃ a i ≥ 2 1 : k ≡ 0 m o d    2 − 1 : k ≡ 1 m o d    2 \mu(x)=\left \{ \begin{aligned} 0 : \exists a_i \geq 2 \\ 1 : k \equiv 0 \mod 2 \\ -1: k \equiv 1 \mod 2 \end{aligned} \right. μ(x)=0:ai21:k0mod21:k1mod2

即当 x ≠ 1 x\neq 1 x=1,且不存在平方因子时:

μ ( x ) = ( − 1 ) k \mu(x)=(-1)^k μ(x)=(1)k

当x存在平方因子时:

μ ( x ) = 0 \mu(x)=0 μ(x)=0

特殊地:

μ ( 1 ) = 1 \mu(1)=1 μ(1)=1

2020-12-14 补充

我 GGN_2015 平生最讨厌死记硬背记公式的人, μ \mu μ 函数实际上很好理解:您记得容斥原理吗,当一个区域被奇数个圆覆盖,那么我们记系数因子为 1 1 1 否则我们记系数因子为 − 1 -1 1莫比乌斯函数的本质就是一个容斥原理问题中的系数因子,而在这个容斥原理问题中,每一个圆形的区域,表示的是某个质数的全部倍数。

换言之, μ \mu μ 的定义,主要是为了构造这个性质:

∑ d ∣ n μ ( d ) = [ n = 1 ] \sum_{d|n}\mu(d)=[n=1] dnμ(d)=[n=1]

一些性质

此性质可用来判断一个数是否等于一。

∑ d ∣ n μ ( d ) = [ n = 1 ] \sum_{d|n}\mu(d)=[n=1] dnμ(d)=[n=1]

证明:

n = 1 n=1 n=1时显然成立。

n ≠ 1 n\neq 1 n=1时,不妨令 n = p 1 a 1 ⋅ p 2 a 2 ⋅ . . . ⋅ P k a k n=p_1^{a_1} \cdot p_2^{a_2} \cdot ... \cdot P_k^{a_k} n=p1a1p2a2...Pkak,那么n的因子 d = p 1 b 1 ⋅ p 2 b 2 ⋅ . . . ⋅ P k b k , 0 ≤ b i ≤ a i d=p_1^{b_1} \cdot p_2^{b_2} \cdot ... \cdot P_k^{b_k},0 \leq b_i \leq a_i d=p1b1p2b2...Pkbk,0biai

∃ b i ≥ 2 , μ ( d ) = 0 \exists b_i \geq 2,\mu(d)=0 bi2,μ(d)=0对答案没有贡献。

因此,对答案有贡献d一定满足 ∀ b i ∈ 0 , 1 \forall b_i \in {0,1} bi0,1

枚举每一个有贡献的d,就相当于是从 b i {b_i} bi中选出若干个置为1,其他的置为0。

从k个位置中选出j个位置的方案数为 C k j C_k^j Ckj,而一个由j个质因子组成的数d,有 μ ( d ) = ( − 1 ) j \mu(d)=(-1)^j μ(d)=(1)j。所以,所有由j个质数组成的d对答案的贡献和为 C k j ⋅ ( − 1 ) j C_k^j \cdot (-1)^j Ckj(1)j

因为 j ∈ { 0 , 1 , 2 , . . . , k } j \in \{0,1,2,...,k\} j{0,1,2,...,k},所以:

∑ d ∣ n μ ( d ) = ∑ j = 0 k C k j ⋅ ( − 1 ) j \sum_{d|n}\mu(d)=\sum_{j=0}^k C_k^j \cdot (-1)^j dnμ(d)=j=0kCkj(1)j

根据二项式定理:

∑ j = 0 k C k j ⋅ x j = ( x + 1 ) k \sum_{j=0}^k C_k^j \cdot x^j=(x+1)^k j=0kCkjxj=(x+1)k

所以:

∑ d ∣ n μ ( d ) = ∑ j = 0 k C k j ⋅ ( − 1 ) j = ( ( − 1 ) + 1 ) k = 0 \sum_{d|n}\mu(d)=\sum_{j=0}^k C_k^j \cdot (-1)^j =((-1)+1)^k=0 dnμ(d)=j=0kCkj(1)j=((1)+1)k=0

得证。

欧拉函数

定义

φ ( x ) , x ∈ N + \varphi(x),x\in N^+ φ(x),xN+表示小于x且与x互质的数的个数。

特殊地

φ ( 1 ) = 1 \varphi(1)=1 φ(1)=1

一些性质

积性函数の积性

g c d ( a , b ) = 1 → φ ( a b ) = φ ( a ) ⋅ φ ( b ) gcd(a,b)=1 \rightarrow \varphi(ab) = \varphi(a) \cdot \varphi(b) gcd(a,b)=1φ(ab)=φ(a)φ(b)

证明很显然。

2018.3.16 填坑,后来我惊奇得发现这一点都不显然。。

g c d ( n , m ) = 1 gcd(n, m) = 1 gcd(n,m)=1, 考虑 φ ( n ⋅ m ) \varphi(n \cdot m) φ(nm)的物理意义。

1         2         3        ...  r       ...     m-1       m
m+1       m+2       m+3      ...  m+r     ...    2m-1      2m
2m+1     2m+2      2m+3      ... 2m+r     ...    3m-1      3m
.        .         .                             .         .
.        .         .                             .         .
.        .         .                             .         .
(n-1)m+1 (n-1)m+2  (n-1)m+3 ... (n-1)m+r  ...    nm-1      nm

φ ( n ⋅ m ) \varphi(n \cdot m) φ(nm)的物理意义为上表中与nm互质的数的个数。

因为n和m互质,所以不难证明:一个数x与nm互质的充要条件为x与n互质且x与m互质。

证明:设P(x)为x的质因子集合。因为n和m互质,所以 P ( n ) ∩ P ( m ) = ϕ P(n) \cap P(m) = \phi P(n)P(m)=ϕ, P ( n ⋅ m ) = P ( n ) ∪ P ( m ) P(n \cdot m) = P(n) \cup P(m) P(nm)=P(n)P(m)
gcd ⁡ ( x , n ) = 1 ⇔ P ( x ) ∩ P ( n ) = ϕ \gcd(x, n) = 1 \Leftrightarrow P(x) \cap P(n) = \phi gcd(x,n)=1P(x)P(n)=ϕ
gcd ⁡ ( x , m ) = 1 ⇔ P ( x ) ∩ P ( m ) = ϕ \gcd(x, m) = 1 \Leftrightarrow P(x) \cap P(m) = \phi gcd(x,m)=1P(x)P(m)=ϕ
P ( n ) ∩ P ( m ) = ϕ , P ( x ) ∩ ( P ( n ) ∪ P ( m ) ) = ϕ ⇔ P ( x ) ∩ P ( n ) = ϕ , P ( x ) ∩ P ( m ) = ϕ P(n) \cap P(m) = \phi, P(x) \cap (P(n) \cup P(m))=\phi \Leftrightarrow P(x) \cap P(n) = \phi, P(x) \cap P(m) = \phi P(n)P(m)=ϕ,P(x)(P(n)P(m))=ϕP(x)P(n)=ϕ,P(x)P(m)=ϕ
得证。

发现每一列元素与m的gcd都相同,考虑有哪些列是与m互质的。根据定义,这样的列有 φ ( m ) \varphi(m) φ(m)列。

再考虑这些列中的每一列中与n互质的数的个数,因为每一横行的数在模n意义下同余。所以每一列有 φ ( n ) \varphi(n) φ(n)个元素与n互质。综上, φ ( n ⋅ m ) = φ ( n ) ⋅ φ ( m ) \varphi(n \cdot m) = \varphi(n) \cdot \varphi(m) φ(nm)=φ(n)φ(m),即欧拉函数为积性函数。

补坑结束。

2020-12-14 补充

因为每一行在模n的意义下同余”这种说法显然是荒谬而错误的,但是我很惊讶为什么没有人指出我的错误,可能是看到这篇文章的人太少的缘故。

此处正确的正确方式应该是,由于 g c d ( n , m ) = 1 gcd(n,m)=1 gcd(n,m)=1,不难证明,每一纵列的 n n n 个数恰好构成一个 m o d    n \mod n modn 意义下的剩余系,证明可以采用反证法:

∵ gcd ⁡ ( m , n ) = 1 \because \gcd(m,n)=1 gcd(m,n)=1

∴ ∃ a , b ∈ Z , a m + b n = gcd ⁡ ( m , n ) = 1 \therefore \exist a, b\in \Z, am+bn=\gcd(m,n)=1 a,bZ,am+bn=gcd(m,n)=1

此时,记 m − 1 = a m o d    n m^{-1}=a\mod n m1=amodn 则有:

m − 1 × m = 1 ( m o d n ) m^{-1}\times m=1 \pmod n m1×m=1(modn)

倘若某一纵列上的数不构成一个 m o d    n \mod n modn 意义下的剩余系,那么一定有:

∃ i ≢ j , m i ≡ m j ( m o d n ) \exist i\not \equiv j, mi\equiv mj \pmod{n} ij,mimj(modn)

但是,在同余符号左右两侧同时乘 m − 1 m^{-1} m1 能够得到:

i ≡ j ( m o d n ) i\equiv j \pmod n ij(modn)

这与我们的假设是矛盾的,因此,每一纵列恰构成一个 m o d    n \mod n modn 意义下的剩余系,其中与 n n n互质的数的个数自然也就是 φ ( n ) \varphi(n) φ(n)


另外,当p为质数时:

φ ( p ) = p − 1 \varphi(p)=p-1 φ(p)=p1

这更加显然。

另一个基本性质

x = p 1 a 1 ⋅ p 2 a 2 ⋅ . . . ⋅ p k a k , d = p i x=p_1^{a_1} \cdot p_2^{a_2} \cdot ... \cdot p_k^{a_k},d=p_i x=p1a1p2a2...pkak,d=pi

φ ( x ⋅ d ) = φ ( x ) ⋅ d \varphi(x\cdot d)=\varphi(x) \cdot d φ(xd)=φ(x)d

证明:

首先 t = p i a i → φ ( t ) = { 1 : a i = 0 ( p i − 1 ) ⋅ p i a i − 1 : a i > 0 t=p_i^{a_i} \rightarrow \varphi(t)=\left \{ \begin{aligned}1 : a_i=0 \\ (p_i-1)\cdot p_i^{a_i-1} :a_i >0\end{aligned} \right. t=piaiφ(t)={1:ai=0(pi1)piai1:ai>0, p i p_i pi是质数。

考虑把一个数化成 p i p_i pi进制数,t一定能表示成一个1后面 a i a_i ai个0的形式。对于任意的一个小于t的数d与t互质,当且仅当把t化成 p i p_i pi进制后最后一位不为零。所以说d这个 a i a_i ai p i p_i pi进制数,除了最低位不能为0,有 p i − 1 p_i-1 pi1种可能外,其它的位是什么都可以,各有 p i p_i pi种可能。因此上式成立。

这样的话就有: φ ( p i k + 1 ) = φ ( p i k ) ⋅ p i \varphi(p_i^{k+1})=\varphi(p_i^k)\cdot p_i φ(pik+1)=φ(pik)pi, k ∈ N + k\in N^+ kN+

φ ( x ⋅ d ) = φ ( ( p 1 a 1 ⋅ p 2 a 2 ⋅ . . . p i − 1 a i − 1 ⋅ p i + 1 a i + 1 . . . ⋅ p k a k ) × p i a i + 1 ) = φ ( p 1 a 1 ⋅ p 2 a 2 ⋅ . . . p i − 1 a i − 1 ⋅ p i + 1 a i + 1 . . . ⋅ p k a k ) × φ ( p i ( a i ) + 1 ) = φ ( p 1 a 1 ⋅ p 2 a 2 ⋅ . . . p i − 1 a i − 1 ⋅ p i + 1 a i + 1 . . . ⋅ p k a k ) × φ ( p i a i ) ⋅ p i = φ ( x ) ⋅ d \varphi(x\cdot d)=\varphi((p_1^{a_1}\cdot p_2^{a_2}\cdot ... p_{i-1}^{a_{i-1}}\cdot p_{i+1}^{a_{i+1}}... \cdot p_k^{a_k})\times p_i^{a_i+1})=\varphi(p_1^{a_1}\cdot p_2^{a_2}\cdot ... p_{i-1}^{a_{i-1}}\cdot p_{i+1}^{a_{i+1}}... \cdot p_k^{a_k})\times\varphi( p_i^{(a_i)+1})=\varphi(p_1^{a_1}\cdot p_2^{a_2}\cdot ... p_{i-1}^{a_{i-1}}\cdot p_{i+1}^{a_{i+1}}... \cdot p_k^{a_k})\times\varphi( p_i^{a_i})\cdot p_i=\varphi(x)\cdot d φ(xd)=φ((p1a1p2a2...pi1ai1pi+1ai+1...pkak)×piai+1)=φ(p1a1p2a2...pi1ai1pi+1ai+1...pkak)×φ(pi(ai)+1)=φ(p1a1p2a2...pi1ai1pi+1ai+1...pkak)×φ(piai)pi=φ(x)d

得证。

还有一个比较重要的性质:

∑ d ∣ n φ ( d ) = n \sum_{d|n}\varphi(d)=n dnφ(d)=n

哪位大神能教我一下这个怎么证啊!留坑待补。

[2018.1.22] 在此补坑。前几天碰巧在学校遇到了樊神,向樊神请教了一番,樊神几句话就证出来了,真是佩服。

f ( n ) = ∑ d ∣ n φ ( d ) f(n)=\sum_{d|n} \varphi(d) f(n)=dnφ(d),显然有 f ( 1 ) = 1 f(1)=1 f(1)=1

对于一个质数 p p p f ( p ) = φ ( 1 ) + φ ( p ) = 1 + ( p − 1 ) = p f(p)=\varphi(1) + \varphi(p)=1+(p-1)=p f(p)=φ(1)+φ(p)=1+(p1)=p,显然成立。

数学归纳一下,对于一个质数的若干次幂 p k p^k pk,若此性质已经对 p k − 1 p^{k-1} pk1成立:

f ( p k ) = ∑ t = 0 k φ ( p t ) = φ ( p k ) + ∑ t = 0 k − 1 φ ( p t ) = φ ( p k ) + f ( p k − 1 ) = ( p − 1 ) ⋅ p k − 1 + p k − 1 = p k f(p^k)=\sum_{t=0}^k \varphi(p^t)=\varphi(p^k) + \sum_{t=0}^{k-1} \varphi(p^t)=\varphi(p^k) +f(p^{k-1})=(p-1) \cdot p^{k-1} + p^{k-1}=p^k f(pk)=t=0kφ(pt)=φ(pk)+t=0k1φ(pt)=φ(pk)+f(pk1)=(p1)pk1+pk1=pk

又因为该性质对k=1成立,所以该性质对任意正整数k成立。

对于一个数n,n与 p k p^k pk(p为素数)互质,那么这个数的所有因子一定能写成n的所有因子乘上p的若干次幂的形式。

若n已经满足 f ( n ) = n f(n)=n f(n)=n的性质,

f ( n ⋅ p k ) = ∑ d ∣ n ( ∑ t = 0 k φ ( d ⋅ p t ) ) f(n \cdot p^k)=\sum_{d|n}(\sum_{t=0}^{k}\varphi(d\cdot p^t)) f(npk)=dn(t=0kφ(dpt))

又因为n与 p k p^k pk互质,所以d与 p k p^k pk也一定互质, φ \varphi φ是积性函数,所以 φ ( d ⋅ p t ) = φ ( d ) ⋅ φ ( p t ) \varphi(d\cdot p^t)=\varphi(d) \cdot \varphi(p^t) φ(dpt)=φ(d)φ(pt)

所以 f ( n ⋅ p k ) = ∑ d ∣ n ( ∑ t = 0 k φ ( d ⋅ p t ) ) = ∑ d ∣ n φ ( d ) ⋅ ( ∑ t = 0 k φ ( p t ) ) = ∑ d ∣ n φ ( d ) ⋅ f ( p k ) = f ( p k ) ⋅ ∑ d ∣ n φ ( d ) = f ( p k ) ⋅ f ( n ) = n ⋅ p k f(n \cdot p^k)=\sum_{d|n}(\sum_{t=0}^{k}\varphi(d\cdot p^t))=\sum_{d|n}\varphi(d)\cdot(\sum_{t=0}^{k}\varphi(p^t))=\sum_{d|n}\varphi(d)\cdot f(p^k)=f(p^k) \cdot \sum_{d|n}\varphi(d)=f(p^k) \cdot f(n)=n \cdot p^k f(npk)=dn(t=0kφ(dpt))=dnφ(d)(t=0kφ(pt))=dnφ(d)f(pk)=f(pk)dnφ(d)=f(pk)f(n)=npk

对于任意的一个数都可以进行质因数分解,分解成 n = 1 ⋅ p 1 a 1 ⋅ p 2 a 2 ⋅ . . . ⋅ P k a k n=1\cdot p_1^{a_1} \cdot p_2^{a_2} \cdot ... \cdot P_k^{a_k} n=1p1a1p2a2...Pkak的形式,因为1是成立的,质数两两互质,所以任意正整数n都满足 f ( n ) = n f(n)=n f(n)=n

得证。

[2018.1.22] 填坑到此结束,后面的内容为之前所写。

利用这个性质可以有:

∑ i = 1 n i = ∑ i = 1 n ∑ d ∣ i φ ( d ) = ∑ d = 1 n φ ( d ) × ⌊ n d ⌋ \sum_{i=1}^n i=\sum_{i=1}^n \sum_{d|i}\varphi(d)=\sum_{d=1}^n \varphi(d) \times \left \lfloor \frac{n}{d} \right \rfloor i=1ni=i=1ndiφ(d)=d=1nφ(d)×dn

这里给出欧拉函数的暴力求法:

x = p 1 a 1 ⋅ p 2 a 2 ⋅ . . . ⋅ p k a k → φ ( x ) = x ⋅ ( 1 − 1 p 1 ) ⋅ ( 1 − 1 p 2 ) ⋅ . . . ⋅ ( 1 − 1 p k ) x=p_1^{a_1} \cdot p_2^{a_2}\cdot ...\cdot p_k^{a_k} \rightarrow \varphi(x)=x\cdot(1-\frac{1}{p_1})\cdot(1-\frac{1}{p_2})\cdot...\cdot (1-\frac{1}{p_k}) x=p1a1p2a2...pkakφ(x)=x(1p11)(1p21)...(1pk1)

证明:

φ ( x ) = φ ( p 1 a 1 ⋅ p 2 a 2 ⋅ . . . ⋅ p k a k ) = φ ( p 1 a 1 ) ⋅ φ ( p 2 a 2 ) ⋅ . . . ⋅ φ ( p k a k ) = ( p 1 − 1 ) p 1 ( a 1 ) − 1 ⋅ ( p 2 − 1 ) p 2 ( a 2 ) − 1 ⋅ . . . ⋅ ( p k − 1 ) p k ( a k ) − 1 = ( 1 − 1 p 1 ) p 1 a 1 ⋅ ( 1 − 1 p 2 ) p 2 a 2 ⋅ . . . ⋅ ( 1 − 1 p k ) p k a k = x ⋅ ( 1 − 1 p 1 ) ⋅ ( 1 − 1 p 2 ) ⋅ . . . ⋅ ( 1 − 1 p k ) \varphi(x)=\varphi(p_1^{a_1} \cdot p_2^{a_2}\cdot ...\cdot p_k^{a_k})=\varphi(p_1^{a_1}) \cdot \varphi(p_2^{a_2})\cdot...\cdot\varphi(p_k^{a_k})=(p_1-1)p_1^{(a_1)-1}\cdot(p_2-1)p_2^{(a_2)-1}\cdot...\cdot (p_k-1)p_k^{(a_k)-1}=(1-\frac{1}{p_1})p_1^{a_1}\cdot(1-\frac{1}{p_2})p_2^{a_2}\cdot...\cdot(1-\frac{1}{p_k})p_k^{a_k}=x\cdot(1-\frac{1}{p_1})\cdot(1-\frac{1}{p_2})\cdot...\cdot (1-\frac{1}{p_k}) φ(x)=φ(p1a1p2a2...pkak)=φ(p1a1)φ(p2a2)...φ(pkak)=(p11)p1(a1)1(p21)p2(a2)1...(pk1)pk(ak)1=(1p11)p1a1(1p21)p2a2...(1pk1)pkak=x(1p11)(1p21)...(1pk1)

得证。

狄利克雷卷积

一种生成函数的运算,定义如下:

( f × g ) ( n ) = ∑ d ∣ n f ( d ) ⋅ g ( n d ) (f \times g)(n)=\sum_{d|n}f(d)\cdot g(\frac{n}{d}) (f×g)(n)=dnf(d)g(dn)

常见积性函数

单位函数: i d ( n ) = n id(n)=n id(n)=n

元函数: e ( n ) = [ n = = 1 ] e(n)=[n==1] e(n)=[n==1]

1函数: I ( n ) = 1 I(n)=1 I(n)=1

约数个数: d ( n ) = ∑ d ∣ n 1 d(n)=\sum_{d|n}1 d(n)=dn1

一些常见的性质

f f f为积性函数。

( f × e ) ( n ) = ∑ d ∣ n f ( d ) × e ( n d ) = ∑ d ∣ n f ( d ) × [ n d = 1 ] = f ( n ) (f \times e)(n)=\sum_{d|n}f(d)\times e(\frac{n}{d})=\sum_{d|n}f(d)\times [\frac{n}{d}=1]=f(n) (f×e)(n)=dnf(d)×e(dn)=dnf(d)×[dn=1]=f(n)

即:

f × e = f f \times e=f f×e=f

另外,狄利克雷卷积满足交换律和结合律,其中交换律显然,结合律的证明略。

φ × I = i d \varphi \times I=id φ×I=id

证明:

φ × I = ∑ d ∣ n φ ( d ) ⋅ I ( n d ) = ∑ d ∣ n φ ( d ) = n \varphi \times I=\sum_{d|n}\varphi(d)\cdot I(\frac{n}{d})=\sum_{d|n}\varphi(d)=n φ×I=dnφ(d)I(dn)=dnφ(d)=n

得证。

μ × I = e \mu \times I=e μ×I=e

证明:

( μ × I ) ( n ) = ∑ d ∣ n μ ( d ) ⋅ I ( n d ) = ∑ d ∣ n μ ( d ) = [ n = 1 ] = e ( n ) (\mu \times I)(n)=\sum_{d|n}\mu(d)\cdot I(\frac{n}{d})=\sum_{d|n}\mu(d)=[n=1]=e(n) (μ×I)(n)=dnμ(d)I(dn)=dnμ(d)=[n=1]=e(n)

莫比乌斯反演

内容

若:

F ( n ) = ∑ d ∣ n f ( n ) F(n)=\sum_{d|n}f(n) F(n)=dnf(n)

则:

f ( n ) = ∑ d ∣ n μ ( d ) ⋅ F ( n d ) f(n)=\sum_{d|n}\mu(d)\cdot F(\frac{n}{d}) f(n)=dnμ(d)F(dn)

用狄利克雷卷积表述如下:

若:

F = f × 1 F=f\times 1 F=f×1

则:

f = F × μ f=F\times \mu f=F×μ

从这个角度来讲,证明就很简单了:

F × μ = ( f × 1 ) × μ = f × ( 1 × μ ) = f × e = f F\times \mu=(f\times1)\times\mu=f\times(1\times\mu)=f\times e=f F×μ=(f×1)×μ=f×(1×μ)=f×e=f

杜教筛原理

求积性函数前缀和:

S ( n ) = ∑ i = 1 n f ( i ) S(n)=\sum_{i=1}^n f(i) S(n)=i=1nf(i)

当f的前缀和不好求的时候,考虑一个前缀和比较好求的g,求 f × g f\times g f×g的前缀和。

∑ i = 1 n ( f × g ) ( i ) = ∑ i = 1 n ∑ d ∣ i g ( d ) ⋅ f ( i d ) \sum_{i=1}^n (f \times g)(i)=\sum_{i=1}^n \sum_{d|i}g(d)\cdot f(\frac{i}{d}) i=1n(f×g)(i)=i=1ndig(d)f(di)

枚举d,存在一个 d ∣ i d|i di,那么 f ( i d ) f(\frac{i}{d}) f(di)就要和 g ( d ) g(d) g(d)相乘,而i可以为 d , 2 d , 3 d , . . . , d ⌊ n d ⌋ d,2d,3d,...,d\lfloor \frac{n}{d} \rfloor d,2d,3d,...,ddn,所以 S ( ⌊ n d ⌋ ) S(\lfloor \frac{n}{d} \rfloor) S(dn) g ( d ) g(d) g(d)相乘就是 g ( d ) g(d) g(d)的贡献。

= ∑ d = 1 n g ( d ) ⋅ ∑ i = 1 ⌊ n d ⌋ f ( i ) = ∑ d = 1 n g ( d ) ⋅ S ( ⌊ n d ⌋ ) =\sum_{d=1}^n g(d)\cdot \sum_{i=1}^{\lfloor \frac{n}{d} \rfloor} f(i)=\sum_{d=1}^n g(d) \cdot S(\lfloor \frac{n}{d} \rfloor) =d=1ng(d)i=1dnf(i)=d=1ng(d)S(dn)

所以:

∑ i = 1 n ( f × g ) ( i ) = ∑ d = 1 n g ( d ) ⋅ S ( ⌊ n d ⌋ ) = g ( 1 ) S ( n ) + ∑ i = 2 n g ( i ) ⋅ S ( ⌊ n i ⌋ ) \sum_{i=1}^n (f \times g)(i)=\sum_{d=1}^n g(d) \cdot S(\lfloor \frac{n}{d} \rfloor)=g(1)S(n)+\sum_{i=2}^n g(i) \cdot S(\lfloor \frac{n}{i} \rfloor) i=1n(f×g)(i)=d=1ng(d)S(dn)=g(1)S(n)+i=2ng(i)S(in)

所以:

S ( n ) = ∑ i = 1 n ( f × g ) ( i ) − ∑ i = 2 n g ( i ) ⋅ S ( ⌊ n i ⌋ ) g ( 1 ) S(n)=\frac{\sum_{i=1}^n (f\times g)(i)-\sum_{i=2}^n g(i) \cdot S(\lfloor \frac{n}{i} \rfloor)}{g(1)} S(n)=g(1)i=1n(f×g)(i)i=2ng(i)S(in)

这样的话如果 g g g ( f × g ) (f\times g) (f×g)的前缀和都很好求,那么计算 S ( n ) S(n) S(n)只需要 S ( ⌊ n 2 ⌋ ) , S ( ⌊ n 3 ⌋ ) , . . , S ( ⌊ n n ⌋ ) = S ( 1 ) S(\lfloor \frac{n}{2} \rfloor),S(\lfloor\frac{n}{3}\rfloor),..,S(\lfloor\frac{n}{n}\rfloor)=S(1) S(2n),S(3n),..,S(nn)=S(1)。而又因为 ⌊ n i ⌋ \lfloor \frac{n}{i}\rfloor in只有 O ( n ) O(\sqrt{n}) O(n )种取值,所以记忆化搜索一下会有奇效。

关于 ⌊ n i ⌋ \lfloor \frac{n}{i}\rfloor in的取值问题的证明。

1 ≤ i ≤ n 1\leq i \leq \sqrt{n} 1in 时,就算是结果两两各不相同, ⌊ n i ⌋ \lfloor \frac{n}{i}\rfloor in也只有 n \sqrt{n} n 种取值。

n < i ≤ n \sqrt{n} < i \leq n n <in时, 1 ≤ ⌊ n i ⌋ < n 1 \leq \lfloor \frac{n}{i}\rfloor < \sqrt{n} 1in<n ,就算是取遍值域中的所有值,也只有 n \sqrt{n} n 种取值。

因此 ⌊ n i ⌋ \lfloor \frac{n}{i} \rfloor in的取值种数不超过 2 n 2\sqrt{n} 2n 种,即 O ( n ) O(\sqrt{n}) O(n )种。

得证。

用线性筛求出前 n 2 3 n^\frac{2}{3} n32的前缀和之后再递推,可以将 O ( n 3 4 ) O(n^{\frac{3}{4}}) O(n43)优化到 O ( n 2 3 ) O(n^{\frac{2}{3}}) O(n32)

莫比乌斯反演的实践

2020-12-14 这一部分是大学后补充的,感觉大学后智力水平有所提升QwQ,多半是因为我原先太傻了。

P3327 [SDOI2015]约数个数和

规定:

d ( x ) = ∑ p ∣ ∣ x 1 d(x)=\sum_{p||x}1 d(x)=px1

求:

∑ i = 1 n ∑ j = 1 m d ( i j ) \sum_{i=1}^n\sum_{j=1}^md(ij) i=1nj=1md(ij)

其中: n , m ≤ 5 × 1 0 4 n,m \leq 5\times 10^4 n,m5×104。多组询问,询问组数不超过 5 × 1 0 4 5\times 10^4 5×104

我用这道题简述一下莫比乌斯反演类型题的基础解题思路,因为这道题确实蛮水的。

首先:一个很重要的结论是:

d ( i j ) = ∑ x ∑ y [ g c d ( x , y ) = 1 ] : x ∣ ∣ i , y ∣ ∣ j d(ij)=\sum_x\sum_y[gcd(x,y)=1] : x||i,y||j d(ij)=xy[gcd(x,y)=1]:xi,yj

这个结论的证明很是有趣,看完之后热血沸腾。

记:

i = p 1 a 1 p 2 a 2 ⋯ p n a n , j = p 1 b 1 p 2 b 2 ⋯ p n b n i=p_1^{a_1}p_2^{a_2}\cdots p_n^{a_n},j=p_1^{b_1}p_2^{b_2}\cdots p_n^{b_n} i=p1a1p2a2pnan,j=p1b1p2b2pnbn

若: f ∣ ∣ i j f||ij fij 那么我们记:

f = p 1 c 1 p 2 c 2 ⋯ p n c n f=p_1^{c_1}p_2^{c_2}\cdots p_n^{c_n} f=p1c1p2c2pncn

其中 ∀ k ∈ { 1 , 2 , ⋯   , n } , 0 ≤ c k ≤ a 1 + b 1 \forall k\in\{1, 2, \cdots, n\}, 0\leq c_k\leq a_1+b_1 k{1,2,,n},0cka1+b1

这个时候我们给出一种对应关系:

  1. c k ≤ a k c_k\leq a_k ckak 我们称 f f f 的因子 p k c k p_k^{c_k} pkck i i i 的因子 p k c k p_k^{c_k} pkck 以及 j j j 的因子 p k 0 p_k^{0} pk0 的乘积对应。

  2. c k > a k c_k> a_k ck>ak 我们称 f f f 的因子 p k c k p_k^{c_k} pkck i i i 的因子 p k a k p_k^{a_k} pkak 以及 j j j 的因子 p k c k − a k p_k^{c_k-a_k} pkckak 的乘积对应。

对于 i i i 来说, p k a k p_k^{a_k} pkak p k 0 p_k^{0} pk0 在统计方案数的时候并没有本质区别,因为它们的共同点都是别无选择。所以在 2. 这种情况下,我们说 “ c k > a k c_k> a_k ck>ak 我们称 f f f 的因子 p k c k p_k^{c_k} pkck i i i 的因子 p k 0 p_k^{0} pk0 以及 j j j 的因子 p k c k − a k p_k^{c_k-a_k} pkckak 的乘积对应。” 实际上如果我们仅仅是统计因子的个数的话,取一个 i i i 的因子 x x x,取一个 j j j 的因子 y y y ,若 gcd ⁡ ( x , y ) = 1 \gcd(x,y)=1 gcd(x,y)=1 那么就能唯一对应一个 i j ij ij 的因子 f f f

证明如下:

对于某一个 i j ij ij 的质因子 p k p_k pk,由于 gcd ⁡ ( x , y ) = 1 \gcd(x,y)=1 gcd(x,y)=1 显然,如果 x x x 的展开式含有 p k s k p_k^{s_{k}} pksk 这一项, y y y 的展开式含有 p k t k p_k^{t_{k}} pktk 这一项,那么 s k s_k sk t k t_k tk一定不会同时非零,否则 1 ≠ p k ∣ ∣ g c d ( x , y ) 1\not=p_k||gcd(x, y) 1=pkgcd(x,y),与假设矛盾。

s k ≠ 0 s_k\not =0 sk=0,我们记 p k p_k pk 对因子 f f f 的贡献为 p k s k p_k^{s_k} pksk;当 t k ≠ 0 t_k\not=0 tk=0 (这个时候神奇的事情就出现了)我们记 p k p_k pk 对因子 f f f 的贡献为 p k a k + t k p_k^{a_k+t_k} pkak+tk。按照这两种方法恰好能够建立出一种 互质有序整数对 ( x , y ) (x,y) (x,y) i j ij ij 的因子间的一一映射。

Q . E . D . Q.E.D. Q.E.D.

回到这道题的题面,我介绍一波我的如下几种转化思想:

  1. 条件的作用域是全局的而非局部的
  2. 一切问题的关键都在于对表达式中的循环变量进行分离
  3. 枚举因子的逆过程是枚举倍数,或者说枚举比值(范围一般都有限)
  4. 求和变量变化的范围可以通过隐含的限定条件进行推演

您看了这些无厘头的文字一定会云里雾里,所以我们要用这道例题具体地演示这四种思想。

思想一:“条件的作用域是全局的而非局部的”

这个最好理解,把求和符号中给出地所有条件都删去,只保留去和变量,而把条件写在整个和式地最右侧。

T ( n , m ) = ∑ i = 1 n ∑ i = 1 m d ( i j ) = ( ∑ i ∑ j d ( i j ) : 1 ≤ i ≤ n , 1 ≤ j ≤ m ) T(n,m)=\sum_{i=1}^n\sum_{i=1}^md(ij)=\left(\sum_{i}\sum_jd(ij):1\leq i\leq n,1\leq j\leq m\right) T(n,m)=i=1ni=1md(ij)=(ijd(ij):1in,1jm)

然后,带入我们刚才求得的公式:

T ( n , m ) = ∑ i ∑ j ∑ x ∑ y [ g c d ( x , y ) = 1 ] : 1 ≤ i ≤ n , 1 ≤ j ≤ m , x ∣ ∣ i , y ∣ ∣ j T(n,m)=\sum_{i}\sum_j\sum_x\sum_y[gcd(x,y)=1]:1\leq i\leq n,1\leq j\leq m, x||i, y||j T(n,m)=ijxy[gcd(x,y)=1]:1in,1jm,xi,yj

思想四:“求和变量变化的范围可以通过隐含的限定条件进行推演”

T ( n , m ) = ∑ i ∑ j ∑ x ∑ y [ g c d ( x , y ) = 1 ] : 1 ≤ i ≤ n , 1 ≤ j ≤ m , x ∣ ∣ i , y ∣ ∣ j , 1 ≤ x ≤ n , 1 ≤ y ≤ m T(n,m)=\sum_{i}\sum_j\sum_x\sum_y[gcd(x,y)=1]:1\leq i\leq n,1\leq j\leq m, x||i, y||j,1\leq x\leq n, 1\leq y\leq m T(n,m)=ijxy[gcd(x,y)=1]:1in,1jm,xi,yj1xn,1ym

在循环条件中增加了 x , y x,y x,y 的取值范围。

常用手段: I × μ = e I\times \mu=e I×μ=e

用更具体地语言来写就是:

e ( x ) = [ x = 1 ] = ( ∑ k μ ( k ) : k ∣ ∣ x ) e(x)=[x=1]=\left(\sum_k\mu(k):k||x\right) e(x)=[x=1]=(kμ(k):kx)

带入后得到:

T ( n , m ) = ∑ i ∑ j ∑ x ∑ y ∑ k μ ( k ) : 1 ≤ i ≤ n , 1 ≤ j ≤ m , x ∣ ∣ i , y ∣ ∣ j , 1 ≤ x ≤ n , 1 ≤ y ≤ m , k ∣ ∣ gcd ⁡ ( x , y ) T(n,m)=\sum_{i}\sum_j\sum_x\sum_y\sum_k\mu(k):1\leq i\leq n,1\leq j\leq m, x||i, y||j,1\leq x\leq n, 1\leq y\leq m,k||\gcd(x, y) T(n,m)=ijxykμ(k):1in,1jm,xi,yj1xn,1ym,kgcd(x,y)

但是这样的表述显然是不够简洁的,因为 k ∣ ∣ gcd ⁡ ( x , y ) ⇔ k ∣ ∣ x ∧ k ∣ ∣ y k||\gcd(x, y)\Leftrightarrow k||x \land k||y kgcd(x,y)kxky

T ( n , m ) = ∑ i ∑ j ∑ x ∑ y ∑ k μ ( k ) : 1 ≤ i ≤ n , 1 ≤ j ≤ m , x ∣ ∣ i , y ∣ ∣ j , 1 ≤ x ≤ n , 1 ≤ y ≤ m , k ∣ ∣ x , k ∣ ∣ y , 1 ≤ k ≤ min ⁡ ( n , m ) T(n,m)=\sum_{i}\sum_j\sum_x\sum_y\sum_k\mu(k):1\leq i\leq n,1\leq j\leq m, x||i, y||j,1\leq x\leq n, 1\leq y\leq m,k||x, k||y, 1\leq k\leq \min(n,m) T(n,m)=ijxykμ(k):1in,1jm,xi,yj1xn,1ym,kx,ky,1kmin(n,m)

思路二:“一切问题的关键都在于对表达式中的循环变量进行分离”
思路三:“枚举因子的逆过程是枚举倍数,或者说枚举比值(范围一般都有限)”

不难发现 上述五个 “ ∑ \sum ”的顺序是可以随心所欲的调换的:

T ( n , m ) = ∑ k ∑ x ∑ i ∑ y ∑ j μ ( k ) : 1 ≤ i ≤ n , 1 ≤ j ≤ m , x ∣ ∣ i , y ∣ ∣ j , 1 ≤ x ≤ n , 1 ≤ y ≤ m , k ∣ ∣ x , k ∣ ∣ y , 1 ≤ k ≤ min ⁡ ( n , m ) T(n,m)=\sum_{k}\sum_x\sum_i\sum_y\sum_j\mu(k):1\leq i\leq n,1\leq j\leq m, x||i, y||j,1\leq x\leq n, 1\leq y\leq m,k||x, k||y, 1\leq k\leq \min(n,m) T(n,m)=kxiyjμ(k):1in,1jm,xi,yj1xn,1ym,kx,ky,1kmin(n,m)

在和式中可以随心所欲乘 1 1 1

T ( n , m ) = ∑ k μ ( k ) ( ∑ x ∑ i 1 ) ( ∑ y ∑ j 1 ) : 1 ≤ i ≤ n , 1 ≤ j ≤ m , x ∣ ∣ i , y ∣ ∣ j , 1 ≤ x ≤ n , 1 ≤ y ≤ m , k ∣ ∣ x , k ∣ ∣ y , 1 ≤ k ≤ min ⁡ ( n , m ) T(n,m)=\sum_{k}\mu(k)\left(\sum_x\sum_i1\right)\left(\sum_y\sum_j1\right):1\leq i\leq n,1\leq j\leq m, x||i, y||j,1\leq x\leq n, 1\leq y\leq m,k||x, k||y, 1\leq k\leq \min(n,m) T(n,m)=kμ(k)(xi1)(yj1):1in,1jm,xi,yj1xn,1ym,kx,ky,1kmin(n,m)

不难发现,这个时候变量 i , j i,j i,j 可以轻松除去,因为枚举倍数很容易

T ( n , m ) = ∑ k μ ( k ) ( ∑ x ⌊ n x ⌋ ) ( ∑ y ⌊ m y ⌋ ) : 1 ≤ x ≤ n , 1 ≤ y ≤ m , k ∣ ∣ x , k ∣ ∣ y , 1 ≤ k ≤ min ⁡ ( n , m ) T(n,m)=\sum_{k}\mu(k)\left(\sum_x\left\lfloor\frac{n}{x}\right\rfloor\right)\left(\sum_y\left\lfloor\frac{m}{y}\right\rfloor\right):1\leq x\leq n, 1\leq y\leq m,k||x, k||y, 1\leq k\leq \min(n,m) T(n,m)=kμ(k)(xxn)(yym):1xn,1ym,kx,ky,1kmin(n,m)

x = x ′ k , y = y ′ k x=x'k, y=y'k x=xk,y=yk 直接带入。

T ( n , m ) = ∑ k μ ( k ) ( ∑ x ′ k ⌊ n x ′ k ⌋ ) ( ∑ y ′ k ⌊ m y ′ k ⌋ ) : 1 ≤ x ′ k ≤ n , 1 ≤ y ′ k ≤ m , k ∣ ∣ x , k ∣ ∣ y , 1 ≤ k ≤ min ⁡ ( n , m ) T(n,m)=\sum_{k}\mu(k)\left(\sum_{x'k}\left\lfloor\frac{n}{x'k}\right\rfloor\right)\left(\sum_{y'k}\left\lfloor\frac{m}{y'k}\right\rfloor\right):1\leq x'k\leq n, 1\leq y'k\leq m,k||x, k||y, 1\leq k\leq \min(n,m) T(n,m)=kμ(k)(xkxkn)ykykm:1xkn,1ykm,kx,ky,1kmin(n,m)

换变量:

T ( n , m ) = ∑ k μ ( k ) ( ∑ x ′ ⌊ n x ′ k ⌋ ) ( ∑ y ′ ⌊ m y ′ k ⌋ ) : 1 ≤ x ′ ≤ n k , 1 ≤ y ′ ≤ m k , k ∣ ∣ x , k ∣ ∣ y , 1 ≤ k ≤ min ⁡ ( n , m ) T(n,m)=\sum_{k}\mu(k)\left(\sum_{x'}\left\lfloor\frac{n}{x'k}\right\rfloor\right)\left(\sum_{y'}\left\lfloor\frac{m}{y'k}\right\rfloor\right):1\leq x'\leq \frac{n}{k}, 1\leq y'\leq \frac{m}{k},k||x, k||y, 1\leq k\leq \min(n,m) T(n,m)=kμ(k)(xxkn)yykm:1xkn,1ykm,kx,ky,1kmin(n,m)

S ( x ) = ∑ i = 1 x ⌊ x i ⌋ S(x)=\sum_{i=1}^x{\left\lfloor\frac{x}{i}\right\rfloor} S(x)=i=1xix

则有:

T ( n , m ) = ∑ k μ ( k ) S ( ⌊ n k ⌋ ) S ( ⌊ m k ⌋ ) T(n,m)=\sum_{k}\mu(k)S\left(\left\lfloor\frac{n}{k}\right\rfloor\right)S\left(\left\lfloor\frac{m}{k}\right\rfloor\right) T(n,m)=kμ(k)S(kn)S(km)

其中 n / k n/k n/k m / k m/k m/k 可以采用双重数论分块, S ( x ) S(x) S(x) 可以 O ( max ⁡ ( n , m ) ) O(\max(n, m)) O(max(n,m)) 预处理, μ ( x ) \mu(x) μ(x) 的前缀和可以先线性筛。后循环求和,时间复杂度也是 O ( max ⁡ ( n , m ) ) O(\max(n, m)) O(max(n,m))

这样就能做到预处理 O ( n ) O(n) O(n) 单次询问 O ( n ) O(\sqrt n) O(n ),总时间复杂度为 O ( n n ) O(n\sqrt n) O(nn )

2020-12-14 下午

今天又做了一道莫比乌斯反演的简单问题 洛谷 P2257。

题意简述

∑ x = 1 N ∑ y = 1 M [ gcd ⁡ ( N , M ) i s   p r i m e ] \sum_{x=1}^N\sum_{y=1}^M[\gcd(N,M)is \space prime] x=1Ny=1M[gcd(N,M)is prime]

其中 N , M ≤ 1 0 7 N,M\leq 10^7 N,M107,多组询问,询问组数 ≤ 1 0 4 \leq 10^4 104

这道题中我又总结出了两个新方法:

  1. 能线性筛预处理的,不要反演
  2. 质数检测函数一定要转化成枚举质数的和式,而且质数做因子的时候要后枚举而不是先枚举

公式推到如下(次要取值范围省略):

∑ x ∑ y ∑ p [ g c d ( x , y ) = p ] : p r i m e ( p ) \sum_{x}\sum_{y}\sum_{p}[gcd(x,y)=p]: prime(p) xyp[gcd(x,y)=p]:prime(p)

∑ p ∑ x ∑ y [ g c d ( x , y ) = p ] : p r i m e ( p ) \sum_{p}\sum_{x}\sum_{y}[gcd(x,y)=p]: prime(p) pxy[gcd(x,y)=p]:prime(p)

发现 x , y x,y x,y 仅仅需要枚举 p p p 的倍数就够了。

∑ p ∑ x ′ ∑ y ′ [ g c d ( x ′ , y ′ ) = 1 ] : p r i m e ( p ) , x ′ ≤ N p , y ′ ≤ M p , p ∣ ∣ x ′ , p ∣ ∣ y ′ \sum_{p}\sum_{x'}\sum_{y'}[gcd(x',y')=1]: prime(p), x'\leq \frac{N}{p}, y'\leq \frac{M}{p}, p||x', p||y' pxy[gcd(x,y)=1]:prime(p),xpN,ypM,px,py

这就又一次遇到了我么最常见的反演前的公式。

∑ p ∑ x ′ ∑ y ′ ∑ d μ ( d ) : p r i m e ( p ) , x ′ ≤ N p , y ′ ≤ M p , d ∣ ∣ x ′ , d ∣ ∣ y ′ , p ∣ ∣ x ′ , p ∣ ∣ y ′ \sum_{p}\sum_{x'}\sum_{y'}\sum_{d}\mu(d): prime(p), x'\leq \frac{N}{p}, y'\leq \frac{M}{p},d||x', d||y', p||x', p||y' pxydμ(d):prime(p),xpN,ypM,dx,dy,px,py

常规思路:枚举因子转枚举倍数:

∑ p ∑ d μ ( d ) ( ∑ x ′ 1 ) ( ∑ y ′ 1 ) : p r i m e ( p ) , x ′ ≤ N p , y ′ ≤ M p , d ∣ ∣ x ′ , d ∣ ∣ y ′ , p ∣ ∣ x ′ , p ∣ ∣ y ′ \sum_{p}\sum_{d}\mu(d)\left(\sum_{x'}1\right)\left(\sum_{y'}1\right): prime(p), x'\leq \frac{N}{p}, y'\leq \frac{M}{p},d||x', d||y', p||x', p||y' pdμ(d)(x1)y1:prime(p),xpN,ypM,dx,dy,px,py

∑ p ∑ d μ ( d ) ⌊ N d p ⌋ ⌊ M d p ⌋ : p r i m e ( p ) , 1 ≤ d , p ≤ m i n ( N , M ) \sum_{p}\sum_{d}\mu(d)\left\lfloor\frac{N}{dp}\right\rfloor\left\lfloor\frac{M}{dp}\right\rfloor: prime(p), 1\leq d,p\leq min(N,M) pdμ(d)dpNdpM:prime(p)1d,pmin(N,M)

这个时候就到了振奋人心的时刻了:换元求和。因为上式中如果 d p > min ⁡ ( N , M ) dp>\min(N,M) dp>min(N,M),右侧的 ⌊ N d p ⌋ ⌊ M d p ⌋ \left\lfloor\frac{N}{dp}\right\rfloor\left\lfloor\frac{M}{dp}\right\rfloor dpNdpM 一定等于零,所以仅统计 d p ≤ min ⁡ ( N , M ) dp\leq \min(N,M) dpmin(N,M) 时对答案的贡献即可。换元令 Q = d p Q=dp Q=dp d = Q p d=\frac{Q}{p} d=pQ

∑ p ∑ Q μ ( Q p ) ⌊ N Q ⌋ ⌊ M Q ⌋ : p r i m e ( p ) , Q ≤ min ⁡ ( N , M ) , p ∣ ∣ Q \sum_{p}\sum_{Q}\mu(\frac{Q}{p})\left\lfloor\frac{N}{Q}\right\rfloor\left\lfloor\frac{M}{Q}\right\rfloor: prime(p),Q\leq \min(N,M), p||Q pQμ(pQ)QNQM:prime(p),Qmin(N,M),pQ

∑ Q ⌊ N Q ⌋ ⌊ M Q ⌋ ∑ p μ ( Q p ) : p r i m e ( p ) , Q ≤ min ⁡ ( N , M ) , p ∣ ∣ Q \sum_{Q}\left\lfloor\frac{N}{Q}\right\rfloor\left\lfloor\frac{M}{Q}\right\rfloor\sum_{p}\mu(\frac{Q}{p}): prime(p),Q\leq \min(N,M), p||Q QQNQMpμ(pQ):prime(p),Qmin(N,M),pQ

如果记:

a n s ( Q ) = ∑ p μ ( Q p ) : p r i m e ( p ) , p ∣ ∣ Q ans(Q)=\sum_{p}\mu(\frac{Q}{p}):prime(p),p||Q ans(Q)=pμ(pQ):prime(p),pQ

不难发现, a n s ( Q ) ans(Q) ans(Q) 可通过线性筛求出,能筛就筛,就别反演了(下述六行内容中约定 p 1 , p 2 , ⋯   , p n p_1,p_2,\cdots,p_n p1,p2,,pn 均为质数)。

  1. Q = 1 , a n s ( Q ) = 0 Q=1, ans(Q)=0 Q=1,ans(Q)=0 因为没有质因子。
  2. p r i m e ( Q ) , a n s ( Q ) = 1 prime(Q), ans(Q)=1 prime(Q),ans(Q)=1 只有一个质因子。
  3. Q = p 1 p 2 ⋯ p n , a n s ( Q ) = n × ( − 1 ) n − 1 Q=p_1p_2\cdots p_n, ans(Q)=n\times(-1)^{n-1} Q=p1p2pn,ans(Q)=n×(1)n1
  4. Q = p 1 ⋯ p k − 1 ⋅ p k 2 ⋅ p k + 1 ⋯ p n , a n s ( Q ) = ( − 1 ) n Q=p_1\cdots p_{k-1}\cdot p_k^2\cdot p_{k+1}\cdots p_n, ans(Q)=(-1)^{n} Q=p1pk1pk2pk+1pn,ans(Q)=(1)n
  5. Q = p 1 a 1 p 2 a 2 ⋯ p n a n Q=p_1^{a_1}p_2^{a_2}\cdots p_n^{a_n} Q=p1a1p2a2pnan 且存在 i ≠ j i\not= j i=j使得 a i = a j = 2 a_i=a_j=2 ai=aj=2 那么 a n s ( Q ) = 0 ans(Q)=0 ans(Q)=0
  6. Q = p 1 a 1 p 2 a 2 ⋯ p n a n Q=p_1^{a_1}p_2^{a_2}\cdots p_n^{a_n} Q=p1a1p2a2pnan 且存在 i i i使得 a i ≥ 3 a_i\geq 3 ai3 那么 a n s ( Q ) = 0 ans(Q)=0 ans(Q)=0

上述六种情况的证明都很显然,这就意味着,我们只需要对于每个数 x x x,再计算 μ ( x ) \mu(x) μ(x) 的同时计算 ∑ p ∣ ∣ x [ p r i m e ( p ) ] \sum_{p||x}[prime(p)] px[prime(p)] 以及 x x x 的指数为 2 2 2 的质因子的个数即可。

感觉 C 语言挺好的,C语言它不香吗。

#include <stdio.h>

#define maxn (10000000 + 8)

int vis[maxn];
int tbl[maxn], cnt; /// 质数表 
int pnt[maxn], csqr[maxn], psqr[maxn]; /// 记录质因子的个数以及平方项的个数 
int mu[maxn], ans[maxn];
long long pre[maxn];

void eular(int n) {
	vis[0] = vis[1] = 1; /// 不是质数 
	mu[1]  = 1;
	ans[1] = 0; /// 没有质因子 
	int i, j;
	for(i = 2; i <= n; i ++) {
		if(!vis[i]) {
			tbl[++ cnt] = i;
			pnt [i] = 1; /// 只有一个质因子 
			csqr[i] = 0; /// 没有平方项 
			psqr[i] = 0; /// 平方项质数记为 0 
			ans [i] = 1;
		}
		for(j = 1; tbl[j]<=n/i; j ++) { /// 枚举素数表中的质数 
			int r = tbl[j] * i;
			vis[r] = 1;
			if(i%tbl[j] == 0) {  /// 新增一个平方质因子项 
				pnt[r] = pnt[i]; /// 质因子总数不变 
				if(csqr[i] == 0) {
					csqr[r] = 1; /// 只有一个平方项
					psqr[r] = tbl[j];
					ans [r] = pnt[r]%2==0 ? 1 : -1;
				}else if(csqr[i] >= 1) {
					csqr[r] = 2; /// 已卒 
					psqr[r] = tbl[j];
					ans [r] = 0;
				}
				break;
			}else {
				pnt [r] = pnt[i] + 1; /// 质因子多了一个 
				csqr[r] = csqr[i];
				if(csqr[i] == 0) {
					psqr[r] = 0; /// 没有平方项 
					ans [r] = pnt[r] * (pnt[i]%2==0 ? 1 : -1);
				}else if(csqr[i] == 1) {
					psqr[r] = psqr[i];
					ans [r] = pnt[r]%2==0 ? 1 : -1;
				}else if(csqr[i] >= 2) {
					psqr[r] = 0; /// 不关心 
					ans [r] = 0;
				}
			}
		}
	}
	for(i = 1; i <= n; i ++) {
		pre[i] = pre[i-1] + ans[i];
	}
}

int min(int x, int y) { /// 取较小值 
	return x<y ? x : y;
}

void solve() {
	int n, m; scanf("%d%d", &n, &m);
	int i;
	long long ans = 0;
	for(i = 1; i <= min(n, m); i = min(n/(n/i), m/(m/i))+1) {
		int j = min(n/(n/i), m/(m/i));
		ans += (pre[j] - pre[i-1]) * (m/i) * (n/i);
	}
	printf("%lld\n", ans);
}

int main() {
	eular(10000000);
	int T; scanf("%d", &T);
	while(T --) {
		solve();
	}
	return 0;
}
2020-12-14 晚上

晚上又做了一道莫比乌斯反演的简单问题 洛谷 P3911。

给出 N N N 个整数, A 1 , A 2 , ⋯   , A N A_1, A_2, \cdots, A_N A1,A2,,AN,计算:

∑ i = 1 N ∑ j = 1 N lcm ( A i , A j ) \sum_{i=1}^N\sum_{j=1}^N \text{lcm}(A_i, A_j) i=1Nj=1Nlcm(Ai,Aj)

其中 A i ≤ 5 × 1 0 4 , N ≤ 5 × 1 0 4 A_i \leq 5\times 10^4, N\leq 5\times 10^4 Ai5×104,N5×104

难度实在是不敢恭维,基本上随便推推就出来了,思维方式基本上还是上述的那六种思维方式,但是有多了一个新的技巧。

技巧:权值数组

C n t ( k ) = ∑ i = 1 N [ A i = k ] Cnt(k)=\sum_{i=1}^N[A_i=k] Cnt(k)=i=1N[Ai=k]

下文中,为了表述方便,我们记 max ⁡ { A 1 , A 2 , ⋯   , A N } = M \max\{A_1, A_2, \cdots, A_N\}=M max{A1,A2,,AN}=M

C n t ( k ) Cnt(k) Cnt(k) 表示数值 k k k 在序列 A A A 中的出现次数,这样我们可以通过枚举值域的方式枚举 A i A_i Ai,比较自由。

∑ i ∑ j lcm ( A i , A j ) \sum_{i}\sum_{j}\text{lcm}(A_i, A_j) ijlcm(Ai,Aj)

利用权值数组进行转化:

∑ x ∑ y lcm ( x , y ) C n t ( x ) C n t ( y ) : 1 ≤ x , y ≤ M \sum_{x}\sum_{y}\text{lcm}(x, y)Cnt(x)Cnt(y):1\leq x,y\leq M xylcm(x,y)Cnt(x)Cnt(y):1x,yM

这样我们就成功把 A A A 去掉了,继续变换。

∑ x C n t ( x ) ∑ y C n t ( y ) x y g c d ( x , y ) \sum_xCnt(x)\sum_yCnt(y)\frac{xy}{gcd(x, y)} xCnt(x)yCnt(y)gcd(x,y)xy

看到了我们最喜欢的 gcd,然后开始莫比乌斯反演:

∑ x x C n t ( x ) ∑ y y C n t ( y ) ∑ d 1 d [ g c d ( x , y ) = d ] : d ∣ x , d ∣ y \sum_xxCnt(x)\sum_yyCnt(y)\sum_d\frac{1}{d}[gcd(x, y)=d]:d|x,d|y xxCnt(x)yyCnt(y)dd1[gcd(x,y)=d]:dx,dy

∑ d 1 d ∑ x x C n t ( x ) ∑ y y C n t ( y ) [ g c d ( x / d , y / d ) = 1 ] \sum_d\frac{1}{d}\sum_xxCnt(x)\sum_yyCnt(y)[gcd(x/d, y/d)=1] dd1xxCnt(x)yyCnt(y)[gcd(x/d,y/d)=1]

转莫比乌斯反演:

∑ d 1 d ∑ x x C n t ( x ) ∑ y y C n t ( y ) ∑ k μ ( k ) : k ∣ x d , k ∣ y d \sum_d\frac{1}{d}\sum_xxCnt(x)\sum_yyCnt(y)\sum_k \mu(k):k|\frac{x}{d}, k|\frac{y}{d} dd1xxCnt(x)yyCnt(y)kμ(k):kdx,kdy

枚举因子:

∑ d 1 d ∑ k μ ( k ) ∑ x x C n t ( x ) ∑ y y C n t ( y ) : k ∣ x d , k ∣ y d \sum_d\frac{1}{d}\sum_k \mu(k)\sum_xxCnt(x)\sum_yyCnt(y):k|\frac{x}{d}, k|\frac{y}{d} dd1kμ(k)xxCnt(x)yyCnt(y):kdx,kdy

其实后面两个东西是一样的:

∑ d 1 d ∑ k μ ( k ) ( ∑ x x C n t ( x ) ) 2 : k ∣ x d \sum_d\frac{1}{d}\sum_k \mu(k)\left(\sum_xxCnt(x)\right)^2:k|\frac{x}{d} dd1kμ(k)(xxCnt(x))2:kdx

其中 x x x k d kd kd 的倍数,记:

F ( Q ) = ∑ Q ∣ x x C n t ( x ) F(Q)=\sum_{Q|x}xCnt(x) F(Q)=QxxCnt(x)

不难说明: F ( Q ) F(Q) F(Q) 可以通过埃氏筛法以 O ( m ln ⁡ m ) O(m\ln m) O(mlnm) 的时间复杂度得到。

则有原式等于:

∑ d 1 d ∑ k μ ( k ) F ( Q ) 2 : Q = k d \sum_d\frac{1}{d}\sum_k \mu(k) F(Q)^2:Q=kd dd1kμ(k)F(Q)2:Q=kd

采用更换循环变量的思路:

∑ d 1 d ∑ Q μ ( Q d ) F ( Q ) 2 \sum_d\frac{1}{d}\sum_Q\mu(\frac{Q}{d})F(Q)^2 dd1Qμ(dQ)F(Q)2

不妨令

G ( d ) = ∑ d ∣ Q μ ( Q d ) F ( Q ) 2 G(d)=\sum_{d|Q} \mu(\frac{Q}{d})F(Q)^2 G(d)=dQμ(dQ)F(Q)2

不难说明:在 F ( Q ) F(Q) F(Q) 已知并可以 O ( 1 ) O(1) O(1) 应答时, G ( d ) G(d) G(d) 也可以通过埃氏筛法以 O ( m ln ⁡ m ) O(m\ln m) O(mlnm) 的时间复杂度得到。

因此,我们只需要计算:

∑ d 1 d G ( d ) : 1 ≤ d ≤ m \sum_{d}\frac{1}{d}G(d):1\leq d\leq m dd1G(d):1dm

就能得到答案。

又是C语言代码。

#include <stdio.h>

#define maxn  (50000 + 5)
int cnt[maxn], vis[maxn], mu[maxn], tbl[maxn], pcnt;
long long F[maxn], G[maxn];

int max(int x, int y) { /// 求最大值 
	return x>y ? x : y;
}

void eular(int n) {
	vis[0] = vis[1] = 1; mu[1] = 1;
	int i;
	for(i = 2; i <= n; i ++) {
		if(!vis[i]) {
			tbl[++ pcnt] = i;
			mu[i] = -1;
		}
		int j;
		for(j = 1; j <= pcnt && tbl[j]<=n/i; j ++) {
			int r = tbl[j]*i;
			vis[r] = 1;
			if(i%tbl[j] == 0) {
				mu[r] = 0;
				break;
			}else {
				mu[r] = -mu[i];
			}
		}
	}
}

int main() {
	int N, i, mx = 0; scanf("%d", &N);
	for(i = 1; i <= N; i ++) {
		int tmp; scanf("%d", &tmp);
		cnt[tmp] ++;
		mx = max(mx, tmp);
	}
	eular(mx);
	for(i = 1; i <= mx; i ++) {
		int j;
		for(j = i; j <= mx; j += i) { /// 枚举倍数 
			F[i] += (long long)cnt[j]*j;
		}
	}
	for(i = 1; i <= mx; i ++) {
		int j;
		for(j = i; j <= mx; j += i) { 
			G[i] += F[j]*F[j]*mu[j/i];
		}
	}
	long long ans = 0;
	for(i = 1; i <= mx; i ++) {
		ans += G[i]/i;
	}
	printf("%lld\n", ans);
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值