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

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}p1a1p2a2...Pkak表示一个数的质因数分解,∀i,prime(pi)∧ai∈N+\forall i, prime(p_i) \land a_i \in N^{+}i,prime(pi)aiN+

莫比乌斯函数

定义

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

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

x=p1a1⋅p2a2⋅...⋅Pkakx=p_1^{a_1} \cdot p_2^{a_2} \cdot ... \cdot P_k^{a_k}x=p1a1p2a2...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:ai21:k0mod21:k1mod2

即当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-11莫比乌斯函数的本质就是一个容斥原理问题中的系数因子,而在这个容斥原理问题中,每一个圆形的区域,表示的是某个质数的全部倍数。

换言之,μ\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=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=p1a1p2a2...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=p1b1p2b2...Pkbk,0biai

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

因此,对答案有贡献d一定满足∀bi∈0,1\forall b_i \in {0,1}bi0,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 dnμ(d)=j=0kCkj(1)j

根据二项式定理:

∑j=0kCkj⋅xj=(x+1)k\sum_{j=0}^k C_k^j \cdot x^j=(x+1)^kj=0kCkjxj=(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=0dnμ(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

一些性质

积性函数の积性

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)φ(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) = \phiP(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) = \phigcd(x,n)=1P(x)P(n)=ϕ
gcd⁡(x,m)=1⇔P(x)∩P(m)=ϕ\gcd(x, m) = 1 \Leftrightarrow P(x) \cap P(m) = \phigcd(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) = \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)φ(nm)=φ(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)=1gcd(m,n)=1

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

此时,记 m−1=amod  nm^{-1}=a\mod nm1=amodn 则有:

m−1×m=1(modn)m^{-1}\times m=1 \pmod nm1×m=1(modn)

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

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

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

i≡j(modn)i\equiv j \pmod nij(modn)

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


另外,当p为质数时:

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

这更加显然。

另一个基本性质

x=p1a1⋅p2a2⋅...⋅pkak,d=pix=p_1^{a_1} \cdot p_2^{a_2} \cdot ... \cdot p_k^{a_k},d=p_ix=p1a1p2a2...pkak,d=pi

φ(x⋅d)=φ(x)⋅d\varphi(x\cdot d)=\varphi(x) \cdot dφ(xd)=φ(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(pi1)piai1:ai>0,pip_ipi是质数。

考虑把一个数化成pip_ipi进制数,t一定能表示成一个1后面aia_iai个0的形式。对于任意的一个小于t的数d与t互质,当且仅当把t化成pip_ipi进制后最后一位不为零。所以说d这个aia_iaipip_ipi进制数,除了最低位不能为0,有pi−1p_i-1pi1种可能外,其它的位是什么都可以,各有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^+kN+

φ(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φ(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)=ndnφ(d)=n

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

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

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

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

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

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=0k1φ(pt)=φ(pk)+f(pk1)=(p1)pk1+pk1=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(npk)=dn(t=0kφ(dpt))

又因为n与pkp^kpk互质,所以d与pkp^kpk也一定互质,φ\varphiφ是积性函数,所以φ(d⋅pt)=φ(d)⋅φ(pt)\varphi(d\cdot p^t)=\varphi(d) \cdot \varphi(p^t)φ(dpt)=φ(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(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⋅p1a1⋅p2a2⋅...⋅Pkakn=1\cdot p_1^{a_1} \cdot p_2^{a_2} \cdot ... \cdot P_k^{a_k}n=1p1a1p2a2...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=1ni=i=1ndiφ(d)=d=1nφ(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=p1a1p2a2...pkakφ(x)=x(1p11)(1p21)...(1pk1)

证明:

φ(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)=φ(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∣nf(d)⋅g(nd)(f \times g)(n)=\sum_{d|n}f(d)\cdot g(\frac{n}{d})(f×g)(n)=dnf(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)=dn1

一些常见的性质

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)=dnf(d)×e(dn)=dnf(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=dnφ(d)I(dn)=dnφ(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)=dnμ(d)I(dn)=dnμ(d)=[n=1]=e(n)

莫比乌斯反演

内容

若:

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

则:

f(n)=∑d∣nμ(d)⋅F(nd)f(n)=\sum_{d|n}\mu(d)\cdot F(\frac{n}{d})f(n)=dnμ(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=1nf(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=1n(f×g)(i)=i=1ndig(d)f(di)

枚举d,存在一个d∣id|idi,那么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,...,ddn,所以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=1ng(d)i=1dnf(i)=d=1ng(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=1n(f×g)(i)=d=1ng(d)S(dn)=g(1)S(n)+i=2ng(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}\rfloorin只有O(n)O(\sqrt{n})O(n)种取值,所以记忆化搜索一下会有奇效。

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

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

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

因此⌊ni⌋\lfloor \frac{n}{i} \rfloorin的取值种数不超过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)=px1

求:

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

其中: n,m≤5×104n,m \leq 5\times 10^4n,m5×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)=xy[gcd(x,y)=1]:xi,yj

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

记:

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=p1a1p2a2pnan,j=p1b1p2b2pnbn

若:f∣∣ijf||ijfij 那么我们记:

f=p1c1p2c2⋯pncnf=p_1^{c_1}p_2^{c_2}\cdots p_n^{c_n}f=p1c1p2c2pncn

其中 ∀k∈{1,2,⋯ ,n},0≤ck≤a1+b1\forall k\in\{1, 2, \cdots, n\}, 0\leq c_k\leq a_1+b_1k{1,2,,n},0cka1+b1

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

  1. ck≤akc_k\leq a_kckak 我们称 fff 的因子 pkckp_k^{c_k}pkckiii 的因子 pkckp_k^{c_k}pkck 以及 jjj 的因子 pk0p_k^{0}pk0 的乘积对应。

  2. ck>akc_k> a_kck>ak 我们称 fff 的因子 pkckp_k^{c_k}pkckiii 的因子 pkakp_k^{a_k}pkak 以及 jjj 的因子 pkck−akp_k^{c_k-a_k}pkckak 的乘积对应。

对于 iii 来说,pkakp_k^{a_k}pkakpk0p_k^{0}pk0 在统计方案数的时候并没有本质区别,因为它们的共同点都是别无选择。所以在 2. 这种情况下,我们说 “ck>akc_k> a_kck>ak 我们称 fff 的因子 pkckp_k^{c_k}pkckiii 的因子 pk0p_k^{0}pk0 以及 jjj 的因子 pkck−akp_k^{c_k-a_k}pkckak 的乘积对应。” 实际上如果我们仅仅是统计因子的个数的话,取一个 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_ksktkt_ktk一定不会同时非零,否则 1≠pk∣∣gcd(x,y)1\not=p_k||gcd(x, y)1=pkgcd(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.

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

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

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

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

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

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=1ni=1md(ij)=(ijd(ij):1in,1jm)

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

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)=ijxy[gcd(x,y)=1]:1in,1jm,xi,yj

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

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)=ijxy[gcd(x,y)=1]:1in,1jm,xi,yj1xn,1ym

在循环条件中增加了 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):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∣∣yk||\gcd(x, y)\Leftrightarrow k||x \land k||ykgcd(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)

在和式中可以随心所欲乘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)(xi1)(yj1):1in,1jm,xi,yj1xn,1ym,kx,ky,1kmin(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)(xxn)(yym):1xn,1ym,kx,ky,1kmin(n,m)

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

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)(xkxkn)ykykm:1xkn,1ykm,kx,ky,1kmin(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)(xxkn)yykm:1xkn,1ykm,kx,ky,1kmin(n,m)

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

则有:

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/km/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=1Ny=1M[gcd(N,M)is prime]

其中 N,M≤107N,M\leq 10^7N,M107,多组询问,询问组数 ≤104\leq 10^4104

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

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

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

∑x∑y∑p[gcd(x,y)=p]:prime(p)\sum_{x}\sum_{y}\sum_{p}[gcd(x,y)=p]: prime(p)xyp[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)pxy[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'pxy[gcd(x,y)=1]:prime(p),xpN,ypM,px,py

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

∑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'pxydμ(d):prime(p),xpN,ypM,dx,dy,px,py

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

∑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'pdμ(d)(x1)y1:prime(p),xpN,ypM,dx,dy,px,py

∑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)pdμ(d)dpNdpM:prime(p)1d,pmin(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\rfloordpNdpM 一定等于零,所以仅统计 dp≤min⁡(N,M)dp\leq \min(N,M)dpmin(N,M) 时对答案的贡献即可。换元令 Q=dpQ=dpQ=dpd=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||QpQμ(pQ)QNQM:prime(p),Qmin(N,M),pQ

∑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||QQQNQMpμ(pQ):prime(p),Qmin(N,M),pQ

如果记:

ans(Q)=∑pμ(Qp):prime(p),p∣∣Qans(Q)=\sum_{p}\mu(\frac{Q}{p}):prime(p),p||Qans(Q)=pμ(pQ):prime(p),pQ

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

  1. Q=1,ans(Q)=0Q=1, ans(Q)=0Q=1,ans(Q)=0 因为没有质因子。
  2. prime(Q),ans(Q)=1prime(Q), ans(Q)=1prime(Q),ans(Q)=1 只有一个质因子。
  3. Q=p1p2⋯pn,ans(Q)=n×(−1)n−1Q=p_1p_2\cdots p_n, ans(Q)=n\times(-1)^{n-1}Q=p1p2pn,ans(Q)=n×(1)n1
  4. 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=p1pk1pk2pk+1pn,ans(Q)=(1)n
  5. Q=p1a1p2a2⋯pnanQ=p_1^{a_1}p_2^{a_2}\cdots p_n^{a_n}Q=p1a1p2a2pnan 且存在 i≠ji\not= ji=j使得 ai=aj=2a_i=a_j=2ai=aj=2 那么 ans(Q)=0ans(Q)=0ans(Q)=0
  6. Q=p1a1p2a2⋯pnanQ=p_1^{a_1}p_2^{a_2}\cdots p_n^{a_n}Q=p1a1p2a2pnan 且存在 iii使得 ai≥3a_i\geq 3ai3 那么 ans(Q)=0ans(Q)=0ans(Q)=0

上述六种情况的证明都很显然,这就意味着,我们只需要对于每个数 xxx,再计算 μ(x)\mu(x)μ(x) 的同时计算 ∑p∣∣x[prime(p)]\sum_{p||x}[prime(p)]px[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=1Nj=1Nlcm(Ai,Aj)

其中 Ai≤5×104,N≤5×104A_i \leq 5\times 10^4, N\leq 5\times 10^4Ai5×104,N5×104

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

技巧:权值数组

Cnt(k)=∑i=1N[Ai=k]Cnt(k)=\sum_{i=1}^N[A_i=k]Cnt(k)=i=1N[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)ijlcm(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 Mxylcm(x,y)Cnt(x)Cnt(y):1x,yM

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

∑xCnt(x)∑yCnt(y)xygcd(x,y)\sum_xCnt(x)\sum_yCnt(y)\frac{xy}{gcd(x, y)}xCnt(x)yCnt(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|yxxCnt(x)yyCnt(y)dd1[gcd(x,y)=d]:dx,dy

∑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]dd1xxCnt(x)yyCnt(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}dd1xxCnt(x)yyCnt(y)kμ(k):kdx,kdy

枚举因子:

∑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}dd1kμ(k)xxCnt(x)yyCnt(y):kdx,kdy

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

∑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}dd1kμ(k)(xxCnt(x))2:kdx

其中 xxxkdkdkd 的倍数,记:

F(Q)=∑Q∣xxCnt(x)F(Q)=\sum_{Q|x}xCnt(x)F(Q)=QxxCnt(x)

不难说明:F(Q)F(Q)F(Q) 可以通过埃氏筛法以 O(mln⁡m)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=kddd1kμ(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)^2dd1Qμ(dQ)F(Q)2

不妨令

G(d)=∑d∣Qμ(Qd)F(Q)2G(d)=\sum_{d|Q} \mu(\frac{Q}{d})F(Q)^2G(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(mln⁡m)O(m\ln m)O(mlnm) 的时间复杂度得到。

因此,我们只需要计算:

∑d1dG(d):1≤d≤m\sum_{d}\frac{1}{d}G(d):1\leq d\leq mdd1G(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;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值