2020-12-14 凌晨
已经开始美好大学生活的我,重温了一下曾经熟悉的题目,霎时间,眼圈红了。我爱 OI,OI是我一生为之奋斗的信仰。
老版前言
2017 CDQZ 联训 中向 HSZX 的大佬请教了一些关于莫反的知识,特此感谢!
本文仅介绍一些关于莫比乌斯反演的基础知识。
声明
本文中,若无特殊声明p1a1⋅p2a2⋅...⋅Pkakp_1^{a_1} \cdot p_2^{a_2} \cdot ... \cdot P_k^{a_k}p1a1⋅p2a2⋅...⋅Pkak表示一个数的质因数分解,∀i,prime(pi)∧ai∈N+\forall i, prime(p_i) \land a_i \in N^{+}∀i,prime(pi)∧ai∈N+
莫比乌斯函数
定义
莫比乌斯函数是在数论中一个很重要的积性函数,定义如下。
若正整数x可质因数分解为:
x=p1a1⋅p2a2⋅...⋅Pkakx=p_1^{a_1} \cdot p_2^{a_2} \cdot ... \cdot P_k^{a_k}x=p1a1⋅p2a2⋅...⋅Pkak
μ(x)={0:∃ai≥21:k≡0mod 2−1:k≡1mod 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:∃ai≥21:k≡0mod2−1:k≡1mod2
即当x≠1x\neq 1x=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μ 函数实际上很好理解:您记得容斥原理吗,当一个区域被奇数个圆覆盖,那么我们记系数因子为 111 否则我们记系数因子为 −1-1−1。莫比乌斯函数的本质就是一个容斥原理问题中的系数因子,而在这个容斥原理问题中,每一个圆形的区域,表示的是某个质数的全部倍数。
换言之,μ\muμ 的定义,主要是为了构造这个性质:
∑d∣nμ(d)=[n=1]\sum_{d|n}\mu(d)=[n=1]d∣n∑μ(d)=[n=1]
一些性质
此性质可用来判断一个数是否等于一。
∑d∣nμ(d)=[n=1]\sum_{d|n}\mu(d)=[n=1]d∣n∑μ(d)=[n=1]
证明:
当n=1n=1n=1时显然成立。
当n≠1n\neq 1n=1时,不妨令n=p1a1⋅p2a2⋅...⋅Pkakn=p_1^{a_1} \cdot p_2^{a_2} \cdot ... \cdot P_k^{a_k}n=p1a1⋅p2a2⋅...⋅Pkak,那么n的因子d=p1b1⋅p2b2⋅...⋅Pkbk,0≤bi≤aid=p_1^{b_1} \cdot p_2^{b_2} \cdot ... \cdot P_k^{b_k},0 \leq b_i \leq a_id=p1b1⋅p2b2⋅...⋅Pkbk,0≤bi≤ai。
若∃bi≥2,μ(d)=0\exists b_i \geq 2,\mu(d)=0∃bi≥2,μ(d)=0对答案没有贡献。
因此,对答案有贡献d一定满足∀bi∈0,1\forall b_i \in {0,1}∀bi∈0,1。
枚举每一个有贡献的d,就相当于是从bi{b_i}bi中选出若干个置为1,其他的置为0。
从k个位置中选出j个位置的方案数为CkjC_k^jCkj,而一个由j个质因子组成的数d,有μ(d)=(−1)j\mu(d)=(-1)^jμ(d)=(−1)j。所以,所有由j个质数组成的d对答案的贡献和为Ckj⋅(−1)jC_k^j \cdot (-1)^jCkj⋅(−1)j。
因为 j∈{0,1,2,...,k}j \in \{0,1,2,...,k\}j∈{0,1,2,...,k},所以:
∑d∣nμ(d)=∑j=0kCkj⋅(−1)j\sum_{d|n}\mu(d)=\sum_{j=0}^k C_k^j \cdot (-1)^j d∣n∑μ(d)=j=0∑kCkj⋅(−1)j
根据二项式定理:
∑j=0kCkj⋅xj=(x+1)k\sum_{j=0}^k C_k^j \cdot x^j=(x+1)^kj=0∑kCkj⋅xj=(x+1)k
所以:
∑d∣nμ(d)=∑j=0kCkj⋅(−1)j=((−1)+1)k=0\sum_{d|n}\mu(d)=\sum_{j=0}^k C_k^j \cdot (-1)^j =((-1)+1)^k=0d∣n∑μ(d)=j=0∑kCkj⋅(−1)j=((−1)+1)k=0
得证。
欧拉函数
定义
φ(x),x∈N+\varphi(x),x\in N^+φ(x),x∈N+表示小于x且与x互质的数的个数。
特殊地
φ(1)=1\varphi(1)=1φ(1)=1
一些性质
积性函数の积性
gcd(a,b)=1→φ(ab)=φ(a)⋅φ(b)gcd(a,b)=1 \rightarrow \varphi(ab) = \varphi(a) \cdot \varphi(b) gcd(a,b)=1→φ(ab)=φ(a)⋅φ(b)
证明很显然。
2018.3.16 填坑,后来我惊奇得发现这一点都不显然。。
令gcd(n,m)=1gcd(n, m) = 1gcd(n,m)=1, 考虑φ(n⋅m)\varphi(n \cdot m)φ(n⋅m)的物理意义。
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)φ(n⋅m)的物理意义为上表中与nm互质的数的个数。
因为n和m互质,所以不难证明:一个数x与nm互质的充要条件为x与n互质且x与m互质。
证明:设P(x)为x的质因子集合。因为n和m互质,所以P(n)∩P(m)=ϕP(n) \cap P(m) = \phiP(n)∩P(m)=ϕ, P(n⋅m)=P(n)∪P(m)P(n \cdot m) = P(n) \cup P(m)P(n⋅m)=P(n)∪P(m)
gcd(x,n)=1⇔P(x)∩P(n)=ϕ\gcd(x, n) = 1 \Leftrightarrow P(x) \cap P(n) = \phigcd(x,n)=1⇔P(x)∩P(n)=ϕ
gcd(x,m)=1⇔P(x)∩P(m)=ϕ\gcd(x, m) = 1 \Leftrightarrow P(x) \cap P(m) = \phigcd(x,m)=1⇔P(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) = \phiP(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)φ(n⋅m)=φ(n)⋅φ(m),即欧拉函数为积性函数。
补坑结束。
2020-12-14 补充
“因为每一行在模n的意义下同余”这种说法显然是荒谬而错误的,但是我很惊讶为什么没有人指出我的错误,可能是看到这篇文章的人太少的缘故。
此处正确的正确方式应该是,由于 gcd(n,m)=1gcd(n,m)=1gcd(n,m)=1,不难证明,每一纵列的 nnn 个数恰好构成一个 mod n\mod nmodn 意义下的剩余系,证明可以采用反证法:
∵gcd(m,n)=1\because \gcd(m,n)=1∵gcd(m,n)=1
∴∃a,b∈Z,am+bn=gcd(m,n)=1\therefore \exist a, b\in \Z, am+bn=\gcd(m,n)=1∴∃a,b∈Z,am+bn=gcd(m,n)=1
此时,记 m−1=amod nm^{-1}=a\mod nm−1=amodn 则有:
m−1×m=1(modn)m^{-1}\times m=1 \pmod nm−1×m=1(modn)
倘若某一纵列上的数不构成一个 mod n\mod nmodn 意义下的剩余系,那么一定有:
∃i≢j,mi≡mj(modn)\exist i\not \equiv j, mi\equiv mj \pmod{n}∃i≡j,mi≡mj(modn)
但是,在同余符号左右两侧同时乘 m−1m^{-1}m−1 能够得到:
i≡j(modn)i\equiv j \pmod ni≡j(modn)
这与我们的假设是矛盾的,因此,每一纵列恰构成一个 mod n\mod nmodn 意义下的剩余系,其中与 nnn互质的数的个数自然也就是 φ(n)\varphi(n)φ(n)。
另外,当p为质数时:
φ(p)=p−1\varphi(p)=p-1φ(p)=p−1
这更加显然。
另一个基本性质
x=p1a1⋅p2a2⋅...⋅pkak,d=pix=p_1^{a_1} \cdot p_2^{a_2} \cdot ... \cdot p_k^{a_k},d=p_ix=p1a1⋅p2a2⋅...⋅pkak,d=pi
φ(x⋅d)=φ(x)⋅d\varphi(x\cdot d)=\varphi(x) \cdot dφ(x⋅d)=φ(x)⋅d
证明:
首先t=piai→φ(t)={1:ai=0(pi−1)⋅piai−1:ai>0t=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(pi−1)⋅piai−1:ai>0,pip_ipi是质数。
考虑把一个数化成pip_ipi进制数,t一定能表示成一个1后面aia_iai个0的形式。对于任意的一个小于t的数d与t互质,当且仅当把t化成pip_ipi进制后最后一位不为零。所以说d这个aia_iai位pip_ipi进制数,除了最低位不能为0,有pi−1p_i-1pi−1种可能外,其它的位是什么都可以,各有pip_ipi种可能。因此上式成立。
这样的话就有:φ(pik+1)=φ(pik)⋅pi\varphi(p_i^{k+1})=\varphi(p_i^k)\cdot p_iφ(pik+1)=φ(pik)⋅pi,k∈N+k\in N^+k∈N+
φ(x⋅d)=φ((p1a1⋅p2a2⋅...pi−1ai−1⋅pi+1ai+1...⋅pkak)×piai+1)=φ(p1a1⋅p2a2⋅...pi−1ai−1⋅pi+1ai+1...⋅pkak)×φ(pi(ai)+1)=φ(p1a1⋅p2a2⋅...pi−1ai−1⋅pi+1ai+1...⋅pkak)×φ(piai)⋅pi=φ(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φ(x⋅d)=φ((p1a1⋅p2a2⋅...pi−1ai−1⋅pi+1ai+1...⋅pkak)×piai+1)=φ(p1a1⋅p2a2⋅...pi−1ai−1⋅pi+1ai+1...⋅pkak)×φ(pi(ai)+1)=φ(p1a1⋅p2a2⋅...pi−1ai−1⋅pi+1ai+1...⋅pkak)×φ(piai)⋅pi=φ(x)⋅d
得证。
还有一个比较重要的性质:
∑d∣nφ(d)=n\sum_{d|n}\varphi(d)=nd∣n∑φ(d)=n
哪位大神能教我一下这个怎么证啊!留坑待补。
[2018.1.22] 在此补坑。前几天碰巧在学校遇到了樊神,向樊神请教了一番,樊神几句话就证出来了,真是佩服。
令 f(n)=∑d∣nφ(d)f(n)=\sum_{d|n} \varphi(d)f(n)=∑d∣nφ(d),显然有f(1)=1f(1)=1f(1)=1。
对于一个质数ppp,f(p)=φ(1)+φ(p)=1+(p−1)=pf(p)=\varphi(1) + \varphi(p)=1+(p-1)=pf(p)=φ(1)+φ(p)=1+(p−1)=p,显然成立。
数学归纳一下,对于一个质数的若干次幂pkp^kpk,若此性质已经对pk−1p^{k-1}pk−1成立:
有f(pk)=∑t=0kφ(pt)=φ(pk)+∑t=0k−1φ(pt)=φ(pk)+f(pk−1)=(p−1)⋅pk−1+pk−1=pkf(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^kf(pk)=∑t=0kφ(pt)=φ(pk)+∑t=0k−1φ(pt)=φ(pk)+f(pk−1)=(p−1)⋅pk−1+pk−1=pk。
又因为该性质对k=1成立,所以该性质对任意正整数k成立。
对于一个数n,n与pkp^kpk(p为素数)互质,那么这个数的所有因子一定能写成n的所有因子乘上p的若干次幂的形式。
若n已经满足f(n)=nf(n)=nf(n)=n的性质,
有f(n⋅pk)=∑d∣n(∑t=0kφ(d⋅pt))f(n \cdot p^k)=\sum_{d|n}(\sum_{t=0}^{k}\varphi(d\cdot p^t))f(n⋅pk)=∑d∣n(∑t=0kφ(d⋅pt))。
又因为n与pkp^kpk互质,所以d与pkp^kpk也一定互质,φ\varphiφ是积性函数,所以φ(d⋅pt)=φ(d)⋅φ(pt)\varphi(d\cdot p^t)=\varphi(d) \cdot \varphi(p^t)φ(d⋅pt)=φ(d)⋅φ(pt)
所以f(n⋅pk)=∑d∣n(∑t=0kφ(d⋅pt))=∑d∣nφ(d)⋅(∑t=0kφ(pt))=∑d∣nφ(d)⋅f(pk)=f(pk)⋅∑d∣nφ(d)=f(pk)⋅f(n)=n⋅pkf(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^kf(n⋅pk)=∑d∣n(∑t=0kφ(d⋅pt))=∑d∣nφ(d)⋅(∑t=0kφ(pt))=∑d∣nφ(d)⋅f(pk)=f(pk)⋅∑d∣nφ(d)=f(pk)⋅f(n)=n⋅pk。
对于任意的一个数都可以进行质因数分解,分解成n=1⋅p1a1⋅p2a2⋅...⋅Pkakn=1\cdot p_1^{a_1} \cdot p_2^{a_2} \cdot ... \cdot P_k^{a_k}n=1⋅p1a1⋅p2a2⋅...⋅Pkak的形式,因为1是成立的,质数两两互质,所以任意正整数n都满足f(n)=nf(n)=nf(n)=n。
得证。
[2018.1.22] 填坑到此结束,后面的内容为之前所写。
利用这个性质可以有:
∑i=1ni=∑i=1n∑d∣iφ(d)=∑d=1nφ(d)×⌊nd⌋\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=1∑ni=i=1∑nd∣i∑φ(d)=d=1∑nφ(d)×⌊dn⌋
这里给出欧拉函数的暴力求法:
x=p1a1⋅p2a2⋅...⋅pkak→φ(x)=x⋅(1−1p1)⋅(1−1p2)⋅...⋅(1−1pk)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=p1a1⋅p2a2⋅...⋅pkak→φ(x)=x⋅(1−p11)⋅(1−p21)⋅...⋅(1−pk1)
证明:
φ(x)=φ(p1a1⋅p2a2⋅...⋅pkak)=φ(p1a1)⋅φ(p2a2)⋅...⋅φ(pkak)=(p1−1)p1(a1)−1⋅(p2−1)p2(a2)−1⋅...⋅(pk−1)pk(ak)−1=(1−1p1)p1a1⋅(1−1p2)p2a2⋅...⋅(1−1pk)pkak=x⋅(1−1p1)⋅(1−1p2)⋅...⋅(1−1pk)\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)=φ(p1a1⋅p2a2⋅...⋅pkak)=φ(p1a1)⋅φ(p2a2)⋅...⋅φ(pkak)=(p1−1)p1(a1)−1⋅(p2−1)p2(a2)−1⋅...⋅(pk−1)pk(ak)−1=(1−p11)p1a1⋅(1−p21)p2a2⋅...⋅(1−pk1)pkak=x⋅(1−p11)⋅(1−p21)⋅...⋅(1−pk1)
得证。
狄利克雷卷积
一种生成函数的运算,定义如下:
(f×g)(n)=∑d∣nf(d)⋅g(nd)(f \times g)(n)=\sum_{d|n}f(d)\cdot g(\frac{n}{d})(f×g)(n)=d∣n∑f(d)⋅g(dn)
常见积性函数
单位函数:id(n)=nid(n)=nid(n)=n。
元函数:e(n)=[n==1]e(n)=[n==1]e(n)=[n==1]。
1函数:I(n)=1I(n)=1I(n)=1。
约数个数:d(n)=∑d∣n1d(n)=\sum_{d|n}1d(n)=∑d∣n1。
一些常见的性质
fff为积性函数。
(f×e)(n)=∑d∣nf(d)×e(nd)=∑d∣nf(d)×[nd=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)=d∣n∑f(d)×e(dn)=d∣n∑f(d)×[dn=1]=f(n)
即:
f×e=ff \times e=ff×e=f
另外,狄利克雷卷积满足交换律和结合律,其中交换律显然,结合律的证明略。
φ×I=id\varphi \times I=idφ×I=id
证明:
φ×I=∑d∣nφ(d)⋅I(nd)=∑d∣nφ(d)=n\varphi \times I=\sum_{d|n}\varphi(d)\cdot I(\frac{n}{d})=\sum_{d|n}\varphi(d)=nφ×I=d∣n∑φ(d)⋅I(dn)=d∣n∑φ(d)=n
得证。
μ×I=e\mu \times I=eμ×I=e
证明:
(μ×I)(n)=∑d∣nμ(d)⋅I(nd)=∑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)=d∣n∑μ(d)⋅I(dn)=d∣n∑μ(d)=[n=1]=e(n)
莫比乌斯反演
内容
若:
F(n)=∑d∣nf(n)F(n)=\sum_{d|n}f(n)F(n)=d∣n∑f(n)
则:
f(n)=∑d∣nμ(d)⋅F(nd)f(n)=\sum_{d|n}\mu(d)\cdot F(\frac{n}{d})f(n)=d∣n∑μ(d)⋅F(dn)
用狄利克雷卷积表述如下:
若:
F=f×1F=f\times 1F=f×1
则:
f=F×μf=F\times \muf=F×μ
从这个角度来讲,证明就很简单了:
F×μ=(f×1)×μ=f×(1×μ)=f×e=fF\times \mu=(f\times1)\times\mu=f\times(1\times\mu)=f\times e=fF×μ=(f×1)×μ=f×(1×μ)=f×e=f
杜教筛原理
求积性函数前缀和:
S(n)=∑i=1nf(i)S(n)=\sum_{i=1}^n f(i)S(n)=i=1∑nf(i)
当f的前缀和不好求的时候,考虑一个前缀和比较好求的g,求f×gf\times gf×g的前缀和。
∑i=1n(f×g)(i)=∑i=1n∑d∣ig(d)⋅f(id)\sum_{i=1}^n (f \times g)(i)=\sum_{i=1}^n \sum_{d|i}g(d)\cdot f(\frac{i}{d})i=1∑n(f×g)(i)=i=1∑nd∣i∑g(d)⋅f(di)
枚举d,存在一个d∣id|id∣i,那么f(id)f(\frac{i}{d})f(di)就要和g(d)g(d)g(d)相乘,而i可以为d,2d,3d,...,d⌊nd⌋d,2d,3d,...,d\lfloor \frac{n}{d} \rfloord,2d,3d,...,d⌊dn⌋,所以S(⌊nd⌋)S(\lfloor \frac{n}{d} \rfloor)S(⌊dn⌋)与g(d)g(d)g(d)相乘就是g(d)g(d)g(d)的贡献。
=∑d=1ng(d)⋅∑i=1⌊nd⌋f(i)=∑d=1ng(d)⋅S(⌊nd⌋)=\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=1∑ng(d)⋅i=1∑⌊dn⌋f(i)=d=1∑ng(d)⋅S(⌊dn⌋)
所以:
∑i=1n(f×g)(i)=∑d=1ng(d)⋅S(⌊nd⌋)=g(1)S(n)+∑i=2ng(i)⋅S(⌊ni⌋)\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=1∑n(f×g)(i)=d=1∑ng(d)⋅S(⌊dn⌋)=g(1)S(n)+i=2∑ng(i)⋅S(⌊in⌋)
所以:
S(n)=∑i=1n(f×g)(i)−∑i=2ng(i)⋅S(⌊ni⌋)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⌋)
这样的话如果ggg和(f×g)(f\times g)(f×g)的前缀和都很好求,那么计算S(n)S(n)S(n)只需要S(⌊n2⌋),S(⌊n3⌋),..,S(⌊nn⌋)=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)。而又因为⌊ni⌋\lfloor \frac{n}{i}\rfloor⌊in⌋只有O(n)O(\sqrt{n})O(n)种取值,所以记忆化搜索一下会有奇效。
关于⌊ni⌋\lfloor \frac{n}{i}\rfloor⌊in⌋的取值问题的证明。
当1≤i≤n1\leq i \leq \sqrt{n}1≤i≤n时,就算是结果两两各不相同,⌊ni⌋\lfloor \frac{n}{i}\rfloor⌊in⌋也只有n\sqrt{n}n种取值。
当n<i≤n\sqrt{n} < i \leq nn<i≤n时,1≤⌊ni⌋<n1 \leq \lfloor \frac{n}{i}\rfloor < \sqrt{n}1≤⌊in⌋<n,就算是取遍值域中的所有值,也只有n\sqrt{n}n种取值。
因此⌊ni⌋\lfloor \frac{n}{i} \rfloor⌊in⌋的取值种数不超过2n2\sqrt{n}2n种,即O(n)O(\sqrt{n})O(n)种。
得证。
用线性筛求出前n23n^\frac{2}{3}n32的前缀和之后再递推,可以将O(n34)O(n^{\frac{3}{4}})O(n43)优化到O(n23)O(n^{\frac{2}{3}})O(n32)。
莫比乌斯反演的实践
2020-12-14 这一部分是大学后补充的,感觉大学后智力水平有所提升QwQ,多半是因为我原先太傻了。
P3327 [SDOI2015]约数个数和
规定:
d(x)=∑p∣∣x1d(x)=\sum_{p||x}1d(x)=p∣∣x∑1
求:
∑i=1n∑j=1md(ij)\sum_{i=1}^n\sum_{j=1}^md(ij)i=1∑nj=1∑md(ij)
其中: n,m≤5×104n,m \leq 5\times 10^4n,m≤5×104。多组询问,询问组数不超过 5×1045\times 10^45×104。
我用这道题简述一下莫比乌斯反演类型题的基础解题思路,因为这道题确实蛮水的。
首先:一个很重要的结论是:
d(ij)=∑x∑y[gcd(x,y)=1]:x∣∣i,y∣∣jd(ij)=\sum_x\sum_y[gcd(x,y)=1] : x||i,y||jd(ij)=x∑y∑[gcd(x,y)=1]:x∣∣i,y∣∣j
这个结论的证明很是有趣,看完之后热血沸腾。
记:
i=p1a1p2a2⋯pnan,j=p1b1p2b2⋯pnbni=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=p1a1p2a2⋯pnan,j=p1b1p2b2⋯pnbn
若:f∣∣ijf||ijf∣∣ij 那么我们记:
f=p1c1p2c2⋯pncnf=p_1^{c_1}p_2^{c_2}\cdots p_n^{c_n}f=p1c1p2c2⋯pncn
其中 ∀k∈{1,2,⋯ ,n},0≤ck≤a1+b1\forall k\in\{1, 2, \cdots, n\}, 0\leq c_k\leq a_1+b_1∀k∈{1,2,⋯,n},0≤ck≤a1+b1
这个时候我们给出一种对应关系:
-
若 ck≤akc_k\leq a_kck≤ak 我们称 fff 的因子 pkckp_k^{c_k}pkck 与 iii 的因子 pkckp_k^{c_k}pkck 以及 jjj 的因子 pk0p_k^{0}pk0 的乘积对应。
-
若 ck>akc_k> a_kck>ak 我们称 fff 的因子 pkckp_k^{c_k}pkck 与 iii 的因子 pkakp_k^{a_k}pkak 以及 jjj 的因子 pkck−akp_k^{c_k-a_k}pkck−ak 的乘积对应。
对于 iii 来说,pkakp_k^{a_k}pkak 与 pk0p_k^{0}pk0 在统计方案数的时候并没有本质区别,因为它们的共同点都是别无选择。所以在 2. 这种情况下,我们说 “若 ck>akc_k> a_kck>ak 我们称 fff 的因子 pkckp_k^{c_k}pkck 与 iii 的因子 pk0p_k^{0}pk0 以及 jjj 的因子 pkck−akp_k^{c_k-a_k}pkck−ak 的乘积对应。” 实际上如果我们仅仅是统计因子的个数的话,取一个 iii 的因子 xxx,取一个 jjj 的因子 yyy ,若 gcd(x,y)=1\gcd(x,y)=1gcd(x,y)=1 那么就能唯一对应一个 ijijij 的因子 fff。
证明如下:
对于某一个 ijijij 的质因子 pkp_kpk,由于 gcd(x,y)=1\gcd(x,y)=1gcd(x,y)=1 显然,如果 xxx 的展开式含有 pkskp_k^{s_{k}}pksk 这一项,yyy 的展开式含有 pktkp_k^{t_{k}}pktk 这一项,那么 sks_ksk 和 tkt_ktk一定不会同时非零,否则 1≠pk∣∣gcd(x,y)1\not=p_k||gcd(x, y)1=pk∣∣gcd(x,y),与假设矛盾。
当 sk≠0s_k\not =0sk=0,我们记 pkp_kpk 对因子 fff 的贡献为 pkskp_k^{s_k}pksk;当 tk≠0t_k\not=0tk=0 (这个时候神奇的事情就出现了)我们记 pkp_kpk 对因子 fff 的贡献为 pkak+tkp_k^{a_k+t_k}pkak+tk。按照这两种方法恰好能够建立出一种 互质有序整数对 (x,y)(x,y)(x,y) 与 ijijij 的因子间的一一映射。
Q.E.D.Q.E.D.Q.E.D.
回到这道题的题面,我介绍一波我的如下几种转化思想:
- 条件的作用域是全局的而非局部的
- 一切问题的关键都在于对表达式中的循环变量进行分离
- 枚举因子的逆过程是枚举倍数,或者说枚举比值(范围一般都有限)
- 求和变量变化的范围可以通过隐含的限定条件进行推演
您看了这些无厘头的文字一定会云里雾里,所以我们要用这道例题具体地演示这四种思想。
思想一:“条件的作用域是全局的而非局部的”
这个最好理解,把求和符号中给出地所有条件都删去,只保留去和变量,而把条件写在整个和式地最右侧。
T(n,m)=∑i=1n∑i=1md(ij)=(∑i∑jd(ij):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=1∑ni=1∑md(ij)=(i∑j∑d(ij):1≤i≤n,1≤j≤m)
然后,带入我们刚才求得的公式:
T(n,m)=∑i∑j∑x∑y[gcd(x,y)=1]:1≤i≤n,1≤j≤m,x∣∣i,y∣∣jT(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||jT(n,m)=i∑j∑x∑y∑[gcd(x,y)=1]:1≤i≤n,1≤j≤m,x∣∣i,y∣∣j
思想四:“求和变量变化的范围可以通过隐含的限定条件进行推演”
T(n,m)=∑i∑j∑x∑y[gcd(x,y)=1]:1≤i≤n,1≤j≤m,x∣∣i,y∣∣j,1≤x≤n,1≤y≤mT(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 mT(n,m)=i∑j∑x∑y∑[gcd(x,y)=1]:1≤i≤n,1≤j≤m,x∣∣i,y∣∣j,1≤x≤n,1≤y≤m
在循环条件中增加了 x,yx,yx,y 的取值范围。
常用手段: I×μ=eI\times \mu=eI×μ=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):k∣∣x)
带入后得到:
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)=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)
但是这样的表述显然是不够简洁的,因为 k∣∣gcd(x,y)⇔k∣∣x∧k∣∣yk||\gcd(x, y)\Leftrightarrow k||x \land k||yk∣∣gcd(x,y)⇔k∣∣x∧k∣∣y
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)=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)
思路二:“一切问题的关键都在于对表达式中的循环变量进行分离”
思路三:“枚举因子的逆过程是枚举倍数,或者说枚举比值(范围一般都有限)”
不难发现 上述五个 “∑\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)=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)
在和式中可以随心所欲乘111。
T(n,m)=∑kμ(k)(∑x∑i1)(∑y∑j1):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)(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)
不难发现,这个时候变量 i,ji,ji,j 可以轻松除去,因为枚举倍数很容易。
T(n,m)=∑kμ(k)(∑x⌊nx⌋)(∑y⌊my⌋):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)(x∑⌊xn⌋)(y∑⌊ym⌋):1≤x≤n,1≤y≤m,k∣∣x,k∣∣y,1≤k≤min(n,m)
令 x=x′k,y=y′kx=x'k, y=y'kx=x′k,y=y′k 直接带入。
T(n,m)=∑kμ(k)(∑x′k⌊nx′k⌋)(∑y′k⌊my′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)(x′k∑⌊x′kn⌋)⎝⎛y′k∑⌊y′km⌋⎠⎞:1≤x′k≤n,1≤y′k≤m,k∣∣x,k∣∣y,1≤k≤min(n,m)
换变量:
T(n,m)=∑kμ(k)(∑x′⌊nx′k⌋)(∑y′⌊my′k⌋):1≤x′≤nk,1≤y′≤mk,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)(x′∑⌊x′kn⌋)⎝⎛y′∑⌊y′km⌋⎠⎞:1≤x′≤kn,1≤y′≤km,k∣∣x,k∣∣y,1≤k≤min(n,m)
记
S(x)=∑i=1x⌊xi⌋S(x)=\sum_{i=1}^x{\left\lfloor\frac{x}{i}\right\rfloor}S(x)=i=1∑x⌊ix⌋
则有:
T(n,m)=∑kμ(k)S(⌊nk⌋)S(⌊mk⌋)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/kn/kn/k 和 m/km/km/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(nn)O(n\sqrt n)O(nn)。
2020-12-14 下午
今天又做了一道莫比乌斯反演的简单问题 洛谷 P2257。
题意简述
∑x=1N∑y=1M[gcd(N,M)is prime]\sum_{x=1}^N\sum_{y=1}^M[\gcd(N,M)is \space prime]x=1∑Ny=1∑M[gcd(N,M)is prime]
其中 N,M≤107N,M\leq 10^7N,M≤107,多组询问,询问组数 ≤104\leq 10^4≤104。
这道题中我又总结出了两个新方法:
- 能线性筛预处理的,不要反演
- 质数检测函数一定要转化成枚举质数的和式,而且质数做因子的时候要后枚举而不是先枚举
公式推到如下(次要取值范围省略):
∑x∑y∑p[gcd(x,y)=p]:prime(p)\sum_{x}\sum_{y}\sum_{p}[gcd(x,y)=p]: prime(p)x∑y∑p∑[gcd(x,y)=p]:prime(p)
∑p∑x∑y[gcd(x,y)=p]:prime(p)\sum_{p}\sum_{x}\sum_{y}[gcd(x,y)=p]: prime(p)p∑x∑y∑[gcd(x,y)=p]:prime(p)
发现 x,yx,yx,y 仅仅需要枚举 ppp 的倍数就够了。
∑p∑x′∑y′[gcd(x′,y′)=1]:prime(p),x′≤Np,y′≤Mp,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'p∑x′∑y′∑[gcd(x′,y′)=1]:prime(p),x′≤pN,y′≤pM,p∣∣x′,p∣∣y′
这就又一次遇到了我么最常见的反演前的公式。
∑p∑x′∑y′∑dμ(d):prime(p),x′≤Np,y′≤Mp,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'p∑x′∑y′∑d∑μ(d):prime(p),x′≤pN,y′≤pM,d∣∣x′,d∣∣y′,p∣∣x′,p∣∣y′
常规思路:枚举因子转枚举倍数:
∑p∑dμ(d)(∑x′1)(∑y′1):prime(p),x′≤Np,y′≤Mp,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'p∑d∑μ(d)(x′∑1)⎝⎛y′∑1⎠⎞:prime(p),x′≤pN,y′≤pM,d∣∣x′,d∣∣y′,p∣∣x′,p∣∣y′
∑p∑dμ(d)⌊Ndp⌋⌊Mdp⌋:prime(p),1≤d,p≤min(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)p∑d∑μ(d)⌊dpN⌋⌊dpM⌋:prime(p),1≤d,p≤min(N,M)
这个时候就到了振奋人心的时刻了:换元求和。因为上式中如果 dp>min(N,M)dp>\min(N,M)dp>min(N,M),右侧的 ⌊Ndp⌋⌊Mdp⌋\left\lfloor\frac{N}{dp}\right\rfloor\left\lfloor\frac{M}{dp}\right\rfloor⌊dpN⌋⌊dpM⌋ 一定等于零,所以仅统计 dp≤min(N,M)dp\leq \min(N,M)dp≤min(N,M) 时对答案的贡献即可。换元令 Q=dpQ=dpQ=dp 即 d=Qpd=\frac{Q}{p}d=pQ。
∑p∑Qμ(Qp)⌊NQ⌋⌊MQ⌋:prime(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||Qp∑Q∑μ(pQ)⌊QN⌋⌊QM⌋:prime(p),Q≤min(N,M),p∣∣Q
∑Q⌊NQ⌋⌊MQ⌋∑pμ(Qp):prime(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||QQ∑⌊QN⌋⌊QM⌋p∑μ(pQ):prime(p),Q≤min(N,M),p∣∣Q
如果记:
ans(Q)=∑pμ(Qp):prime(p),p∣∣Qans(Q)=\sum_{p}\mu(\frac{Q}{p}):prime(p),p||Qans(Q)=p∑μ(pQ):prime(p),p∣∣Q
不难发现,ans(Q)ans(Q)ans(Q) 可通过线性筛求出,能筛就筛,就别反演了(下述六行内容中约定p1,p2,⋯ ,pnp_1,p_2,\cdots,p_np1,p2,⋯,pn 均为质数)。
- Q=1,ans(Q)=0Q=1, ans(Q)=0Q=1,ans(Q)=0 因为没有质因子。
- prime(Q),ans(Q)=1prime(Q), ans(Q)=1prime(Q),ans(Q)=1 只有一个质因子。
- Q=p1p2⋯pn,ans(Q)=n×(−1)n−1Q=p_1p_2\cdots p_n, ans(Q)=n\times(-1)^{n-1}Q=p1p2⋯pn,ans(Q)=n×(−1)n−1。
- Q=p1⋯pk−1⋅pk2⋅pk+1⋯pn,ans(Q)=(−1)nQ=p_1\cdots p_{k-1}\cdot p_k^2\cdot p_{k+1}\cdots p_n, ans(Q)=(-1)^{n}Q=p1⋯pk−1⋅pk2⋅pk+1⋯pn,ans(Q)=(−1)n。
- 若 Q=p1a1p2a2⋯pnanQ=p_1^{a_1}p_2^{a_2}\cdots p_n^{a_n}Q=p1a1p2a2⋯pnan 且存在 i≠ji\not= ji=j使得 ai=aj=2a_i=a_j=2ai=aj=2 那么 ans(Q)=0ans(Q)=0ans(Q)=0。
- 若 Q=p1a1p2a2⋯pnanQ=p_1^{a_1}p_2^{a_2}\cdots p_n^{a_n}Q=p1a1p2a2⋯pnan 且存在 iii使得 ai≥3a_i\geq 3ai≥3 那么 ans(Q)=0ans(Q)=0ans(Q)=0。
上述六种情况的证明都很显然,这就意味着,我们只需要对于每个数 xxx,再计算 μ(x)\mu(x)μ(x) 的同时计算 ∑p∣∣x[prime(p)]\sum_{p||x}[prime(p)]∑p∣∣x[prime(p)] 以及 xxx 的指数为 222 的质因子的个数即可。
感觉 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。
给出 NNN 个整数,A1,A2,⋯ ,ANA_1, A_2, \cdots, A_NA1,A2,⋯,AN,计算:
∑i=1N∑j=1Nlcm(Ai,Aj)\sum_{i=1}^N\sum_{j=1}^N \text{lcm}(A_i, A_j)i=1∑Nj=1∑Nlcm(Ai,Aj)
其中 Ai≤5×104,N≤5×104A_i \leq 5\times 10^4, N\leq 5\times 10^4Ai≤5×104,N≤5×104。
难度实在是不敢恭维,基本上随便推推就出来了,思维方式基本上还是上述的那六种思维方式,但是有多了一个新的技巧。
技巧:权值数组
Cnt(k)=∑i=1N[Ai=k]Cnt(k)=\sum_{i=1}^N[A_i=k]Cnt(k)=i=1∑N[Ai=k]
下文中,为了表述方便,我们记 max{A1,A2,⋯ ,AN}=M\max\{A_1, A_2, \cdots, A_N\}=Mmax{A1,A2,⋯,AN}=M。
用 Cnt(k)Cnt(k)Cnt(k) 表示数值 kkk 在序列 AAA 中的出现次数,这样我们可以通过枚举值域的方式枚举 AiA_iAi,比较自由。
∑i∑jlcm(Ai,Aj)\sum_{i}\sum_{j}\text{lcm}(A_i, A_j)i∑j∑lcm(Ai,Aj)
利用权值数组进行转化:
∑x∑ylcm(x,y)Cnt(x)Cnt(y):1≤x,y≤M\sum_{x}\sum_{y}\text{lcm}(x, y)Cnt(x)Cnt(y):1\leq x,y\leq Mx∑y∑lcm(x,y)Cnt(x)Cnt(y):1≤x,y≤M
这样我们就成功把 AAA 去掉了,继续变换。
∑xCnt(x)∑yCnt(y)xygcd(x,y)\sum_xCnt(x)\sum_yCnt(y)\frac{xy}{gcd(x, y)}x∑Cnt(x)y∑Cnt(y)gcd(x,y)xy
看到了我们最喜欢的 gcd,然后开始莫比乌斯反演:
∑xxCnt(x)∑yyCnt(y)∑d1d[gcd(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|yx∑xCnt(x)y∑yCnt(y)d∑d1[gcd(x,y)=d]:d∣x,d∣y
∑d1d∑xxCnt(x)∑yyCnt(y)[gcd(x/d,y/d)=1]\sum_d\frac{1}{d}\sum_xxCnt(x)\sum_yyCnt(y)[gcd(x/d, y/d)=1]d∑d1x∑xCnt(x)y∑yCnt(y)[gcd(x/d,y/d)=1]
转莫比乌斯反演:
∑d1d∑xxCnt(x)∑yyCnt(y)∑kμ(k):k∣xd,k∣yd\sum_d\frac{1}{d}\sum_xxCnt(x)\sum_yyCnt(y)\sum_k \mu(k):k|\frac{x}{d}, k|\frac{y}{d}d∑d1x∑xCnt(x)y∑yCnt(y)k∑μ(k):k∣dx,k∣dy
枚举因子:
∑d1d∑kμ(k)∑xxCnt(x)∑yyCnt(y):k∣xd,k∣yd\sum_d\frac{1}{d}\sum_k \mu(k)\sum_xxCnt(x)\sum_yyCnt(y):k|\frac{x}{d}, k|\frac{y}{d}d∑d1k∑μ(k)x∑xCnt(x)y∑yCnt(y):k∣dx,k∣dy
其实后面两个东西是一样的:
∑d1d∑kμ(k)(∑xxCnt(x))2:k∣xd\sum_d\frac{1}{d}\sum_k \mu(k)\left(\sum_xxCnt(x)\right)^2:k|\frac{x}{d}d∑d1k∑μ(k)(x∑xCnt(x))2:k∣dx
其中 xxx 是 kdkdkd 的倍数,记:
F(Q)=∑Q∣xxCnt(x)F(Q)=\sum_{Q|x}xCnt(x)F(Q)=Q∣x∑xCnt(x)
不难说明:F(Q)F(Q)F(Q) 可以通过埃氏筛法以 O(mlnm)O(m\ln m)O(mlnm) 的时间复杂度得到。
则有原式等于:
∑d1d∑kμ(k)F(Q)2:Q=kd\sum_d\frac{1}{d}\sum_k \mu(k) F(Q)^2:Q=kdd∑d1k∑μ(k)F(Q)2:Q=kd
采用更换循环变量的思路:
∑d1d∑Qμ(Qd)F(Q)2\sum_d\frac{1}{d}\sum_Q\mu(\frac{Q}{d})F(Q)^2d∑d1Q∑μ(dQ)F(Q)2
不妨令
G(d)=∑d∣Qμ(Qd)F(Q)2G(d)=\sum_{d|Q} \mu(\frac{Q}{d})F(Q)^2G(d)=d∣Q∑μ(dQ)F(Q)2
不难说明:在 F(Q)F(Q)F(Q) 已知并可以 O(1)O(1)O(1) 应答时,G(d)G(d)G(d) 也可以通过埃氏筛法以 O(mlnm)O(m\ln m)O(mlnm) 的时间复杂度得到。
因此,我们只需要计算:
∑d1dG(d):1≤d≤m\sum_{d}\frac{1}{d}G(d):1\leq d\leq md∑d1G(d):1≤d≤m
就能得到答案。
又是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;
}