莫比乌斯反演题目列表及题解

前言:

本题表中,凡是涉及(n、m),都默认(n leq m)
如果你连莫比乌斯求(sum_{i=1}^n sum_{j=1}^m [gcd(i,j)=1])都还不会,请去这里先入个门。
题目里面的各种套路还是很深的。
如果扎扎实实看完(并做完),一般的莫比乌斯反演肯定没问题了(当然不排除一些毒瘤题啦)。

Part1

这些题目都非常水,莫比乌斯反演入门题,
主要是对莫比乌斯反演应用有一个基本概念。

1.[HAOI2011]Problem b

(具体题目戳我)
题目:一组数据((a、d、c、d leq 5×10^4))求

[sum_{i=a}^{b} sum_{j=c}^d [gcd(i,j)=d] ]

题解:

[sum_{i=1}^{n} sum_{j=1}^m [gcd(i,j)=d] = sum_{i=1}^{lfloor frac{n}{d} floor} sum_{j=1}^{lfloor frac{m}{d} floor} [gcd(i,j)=1] = sum_{i=1}^{lfloor frac{n}{d} floor} mu(i)lfloor frac{lfloor frac{n}{d} floor}{i} floor * lfloor frac{lfloor frac{m}{d} floor}{i} floor ]

数论分块,然后二维容斥即可。

2.[NOI2010]能量采集

(具体题目戳我)
题目:一组数据((n、m leq 10^5)),求

[2*sum_{i=1}^n sum_{j=1}^m gcd(i,j) - n*m ]

题解:

[sum_{i=1}^n sum_{j=1}^m gcd(i,j) =sum_{d=1}^nd sum_{i=1}^{lfloor frac{n}{d} floor} sum_{j=1}^{lfloor frac{m}{d} floor} [gcd(i,j)=1] ]

枚举(d),然后用第1题的方法搞即可。

3.Gcd

(具体题目戳我)
题目:一组数据,给定整数(N(Nleq10^7)),求(1 leq x,y leq N)(Gcd(x,y))为素数的组数
题解:

[sum_{i=1}^n sum_{j=1}^m gcd(i,j) =sum_{d=2}^{d leq n} dsum_{i=1}^{lfloor frac{n}{d} floor} sum_{j=1}^{lfloor frac{m}{d} floor} [gcd(i,j)=1] ]

枚举素数(d),然后用第1题的方法搞即可。

4.[中山市选2011]完全平方数

(具体题目戳我)
题目:(50)组数据,给出(k),求第(k)个不是完全平方数的倍数的数是多少。(k leq 10^9)
题解:
先二分一个(n),然后检查(n)下面有多少个非完全平方数。计算方法为:
(f(i))表示只为(i^2)倍数,并且不是其它平方数倍数的数的个数。
那么令(F(i) = f(i)+f(2i)+....+f(ki)),即为((ri)^2)倍数的数的个数。
那么(F(i) = sum_{i|d} f(d))。显然(F(n) = lfloor frac{n}{i^2} floor)
反演一下:

[f(1) = sum_{i=1}^{lceil sqrt{n} ceil } lfloor frac{n}{i^2} floor ]

直接数论分块即可得到一个数(n)的排名(f(1))

Part2

这一部分的题就相当有难度了(跨度这么大我也很无奈啊
从这些题中,我们可以感受到莫比乌斯反演的一些套路,包括提取公因数、分离变量等。

5.[BZOJ2154]Crash的数字表格

(具体题目戳我)
题目:一组数据,输入(n)(m),((n、m leq 10^7)),求:

[sum_{i=1}^n sum_{j=1}^m lcm(i,j) quad mod quad 20101009 ]

题解:

[Ans = sum_{i=1}^n sum_{j=1}^m lcm(i,j) = sum_{i=1}^n sum_{j=1}^m frac{ij}{gcd(i,j)} = sum_{d=1}^n frac{f(n,m,d)}{d} ]

其中

[f(n,m,d) = sum_{i=1}^n sum_{j=1}^m [gcd(i,j)=d]*ij = sum_{i=1}^{lfloor frac{n}{d} floor} sum_{i=1}^{lfloor frac{m}{d} floor} ij*[gcd(i,j)=1]*d^2 ]

带回原式中:

[Ans = sum_{d=1}^n d*f({lfloor frac{n}{d} floor},{lfloor frac{m}{d} floor},1) ]

考虑一下函数 (f) 的求法:

[f({n},{m},d) = sum_{i=1}^{n } sum_{i=1}^{m } ij*[gcd(i,j)=d] = f(d) ]

[F(d) = sum_{i=1}^{{n}} sum_{i=1}^{{m}} ij*[d|gcd(i,j)] = sum_{i=1}^{lfloor frac{n}{d} floor} sum_{i=1}^{lfloor frac{m}{d} floor} ij= sum_{n|d} f(d) ]

反演一下:

[f(i) = sum_{i|d}mu(frac{d}{i})F(d) , f(1) = sum_{d=1}^nmu(d)F(d) = sum_{d=1}^nmu(d) sum_{i=1}^{{lfloor frac{n}{d} floor}} sum_{j=1}^{lfloor frac{m}{d} floor} ij ]

显然(sum_{i=1}^{{n}} sum_{j=1}^{{m}} ij = sum_{i=1}^{{n}} i *sum_{j=1}^{{m}} j = frac{n*(n+1)}{2} * frac{m*(m+1)}{2})
总结一下,得到了两个式子:

[Ans = sum_{d=1}^n d*f({lfloor frac{n}{d} floor},{lfloor frac{m}{d} floor},1) ]

[f({n},{m},1) = sum_{d=1}^nmu(d) frac{lfloor frac{n}{d} floor*(lfloor frac{n}{d} floor+1)}{2} * frac{lfloor frac{m}{d} floor*(lfloor frac{m}{d} floor+1)}{2} ]

两个式子都可以数论分块,所以复杂度为:(O(sqrt{n})*O(sqrt{n})=O({n}))

6.[SDOI2015]约数个数和

(具体题目戳我)
题目:(5×10^4)组数据,输入(n,m)((n,m leq 5×10^4)),(d(x))表示(x)的约数个数,求:

[sum_{i=1}^n sum_{j=1}^m d(ij) ]

题解:
首先,有定理:

[d(ij) = sum_{t1|i} sum_{t2|j} [gcd(t1,t2)=1] ]

证明:
对于一个约数(d),它必定由(i)的一个约数与(j)的一个约数的乘积。
为了防止算重,我们规定(gcd(t1,t2)=1)才计算。
因为每一个数一定可以被表示为两个互质的数的乘积,所以这样计算是正确的。
同样这样的(t1)(t2)一定存在于(i)(j)的约数中,因为唯一分解定理
所以把原式化为:

[Ans =sum_{i=1}^n sum_{j=1}^m sum_{t1|i} sum_{t2|j} [gcd(t1,t2)=1] ]

四个(sum)很不好看(也不好搞),单独考虑二元组(i,j)的贡献:

[Ans = sum_{u=1}^n sum_{v=1}^m [gcd(u,v)=1] lfloor frac{n}{u} floor lfloor frac{m}{v} floor ]

[f(d) = sum_{u=1}^n sum_{v=1}^m [gcd(u,v)=d] lfloor frac{n}{u} floor lfloor frac{m}{v} floor ]

同理令

[F(d) = sum_{u=1}^n sum_{v=1}^m [d|gcd(u,v)] lfloor frac{n}{u} floor lfloor frac{m}{v} floor = sum_{u=1}^{lfloor frac{n}{d} floor}sum_{u=1}^{lfloor frac{m}{d} floor} lfloor frac{n}{ud} floor lfloor frac{m}{vd} floor ]

所以

[F(d) = sum_{u=1}^{lfloor frac{n}{d} floor}sum_{u=1}^{lfloor frac{m}{d} floor} lfloor frac{n}{ud} floor lfloor frac{m}{vd} floor = sum_{u=1}^{lfloor frac{n}{d} floor} lfloor frac{n}{ud} floor *sum_{u=1}^{lfloor frac{m}{d} floor} lfloor frac{m}{vd} floor = sum(lfloor frac{n}{d} floor)*sum(lfloor frac{m}{d} floor) ]

其中(sum(x)=sum_{i=1}^{x} lfloor frac{x}{i} floor)表示(1)(x)的约数个数和,不懂为什么见这题
又因为

[F(i) = sum_{i|d}f(d) ]

莫比乌斯反演一波:

[f(1) = sum_{i=1}^n mu(i)F(i) = sum_{i=1}^n mu(i) sum(lfloor frac{n}{i} floor)*sum(lfloor frac{m}{i} floor) = Ans ]

其中$$sum(x)=sum_{i=1}^{x} lfloor frac{x}{i} floor$$
显然先 数论分块 预处理(sum(x)),然后每次询问也数论分块求解(f(1))即可。
总的复杂度为:预处理(O(n sqrt{n})) , 询问 (O(T sqrt{n}))

7. [SDOI2017]数字表格

(具体题目戳我)
题目:
(f(i))为斐波那契数列第(i)项,定义(f(0)=0,f(1)=1)
总共输入(10^3)组数据,每次输入(n,m)((n,m leq 10^6)),时限(5 sec),求:

[prod_{i=1}^n prod_{j=1}^m f(gcd(i,j)) ]

题解:
肯定先要提出(gcd(i,j))

[Ans = prod_{i=1}^n prod_{j=1}^m f(gcd(i,j)) = prod_{d=1}^n f(d)^{sum_{i=1}^{lfloor frac{n}{d} floor} sum_{j=1}^{lfloor frac{m}{d} floor} [gcd(i,j)=1]} ]

上面那一坨提出来看(直接跳步骤了)

[sum_{i=1}^{lfloor frac{n}{d} floor} sum_{j=1}^{lfloor frac{m}{d} floor} [gcd(i,j)=1] = sum_{i=1}^{lfloor frac{n}{d} floor} mu(i) {lfloor frac{n}{id} floor} {lfloor frac{m}{id} floor} = r(lfloor frac{n}{d} floor,lfloor frac{m}{d} floor) ]

[Ans = prod_{d=1}^n f(d)^{r(lfloor frac{n}{d} floor,lfloor frac{m}{d} floor)} ]

显然(Ans)(r(n,m))的求解都可以数论分块,此时复杂度为(O(n))可以跑过单组数据。
但是我们有多组数据,考虑如何优化。
看到(id),是不是感觉很套路?令(T = id) , 那么我们把(T)给提出来:

[prod_{d=1}^n f(d)^{sum_{i=1}^{lfloor frac{n}{d} floor} mu(i) {lfloor frac{n}{T} floor} {lfloor frac{m}{T} floor}} = prod_{T=1}^n(prod_{d|T} f(d)^{mu(frac{T}{d})})^{{lfloor frac{n}{T} floor} {lfloor frac{m}{T} floor}} ]

[R(T) = prod_{d|T} f(d)^{mu(frac{T}{d})} ]

这显然是可以(O(n log^2(n)))直接暴力算出来的(因为是枚举因数啊)。
那么

[Ans = prod_{T=1}^n(prod_{d|T} f(d)^{mu(frac{T}{d})})^{{lfloor frac{n}{T} floor} {lfloor frac{m}{T} floor}} = prod_{T=1}^nR(T)^{{lfloor frac{n}{T} floor} {lfloor frac{m}{T} floor}} ]

显然(R(T))是可以记乘法前缀和的,所以每次询问时数论分块搞一波即可。
总的复杂度: 预处理(O(n log^2(n))) , 询问(O(T sqrt{n}log(n)))

Part3

其实比较关键的题目就是(Part2)里的三题了,剩下的这些题当做补充练习。

8. GCD-2(YY的GCD)

(具体题目戳我)
题目:(10^5)组数据,给定整数(N,M(leq10^7)),求(1 leq xleq N) , (1 leq yleq M) ,且(Gcd(x,y))为素数的组数。
题解:
其实就是第三题《(GCD)》的升级版。
前面的步骤直接跳过:

[Ans = sum_{d=1}^n sum_{i=1}^{lfloor frac{n}{d} floor} mu(i) lfloor frac{n}{id} floor lfloor frac{m}{id} floor ]

老套路,令(T = id),提出(T)

[sum_{d=1}^n sum_{i=1}^{lfloor frac{n}{d} floor} mu(i) lfloor frac{n}{id} floor lfloor frac{m}{id} floor = sum_{T=1}^n sum_{d|T} mu(frac{T}{d}) lfloor frac{n}{T} floor lfloor frac{m}{T} floor = sum_{T=1}^nlfloor frac{n}{T} floor lfloor frac{m}{T} floor sum_{d|T} mu(frac{T}{d}) ]

然后只要考虑这个玩意怎么搞即可:

[R(T) = sum_{d|T} mu(frac{T}{d}) ]

额...还记得在基础数论讲素数时说的那个结论吗?
结论回顾: 质数的密度大约是(frac{1}{10})!
所以(O(10^7k) ------> O(10^6k)?)
嗯,好像是这样,所以暴力埃式筛即可。

9. [UVa11426]最大公约数之和——极限版II

(具体题目戳我)
题目:(10^2)组数据,给定整数(n,m(leq10^7)),求:

[sum_{i=1}^{n-1} sum_{j=i+1}^n gcd(i,j) ]

题解:
其实就是第二题《能量采集》的升级版。
考虑二元组((i,j))的构成形式,一共三种:(i<j)(i=j)(i>j)
所以只要求(sum_{i=1}^n sum_{j=1}^n gcd(i,j) = Ans'),那么显然:

[Ans = frac{(Ans' - sum_{i=1}^n i)}{2} ]

下面求(Ans'),前面的步骤直接跳过:

[Ans' = sum_{d=1}^n dsum_{i=1}^{lfloor frac{n}{d} floor} mu(i) {lfloor frac{n}{id} floor }^2 ]

还是老套路(套路就是这么神奇),令(T = id),提出(T)

[Ans' = sum_{T=1}^n sum_{d|T} mu(frac{T}{d}) {lfloor frac{n}{T} floor }^2 d = sum_{T=1}^n {lfloor frac{n}{T} floor }^2sum_{d|T} mu(frac{T}{d}) d ]

那么显然下面这个东东:

[R(x) = sum_{d|T} mu(frac{T}{d})*d ]

是一个狄利克雷卷积 , 直接积性函数线性筛即可。

10.HDU4746: (Mophues)

(具体题目戳我)
名字莫名诡异....
题目:(5*10^3)组数据 , 每次给定一个(n,m,p)((<=5*10^5)),求:

[sum_{i=1}^n sum_{j=1}^m [h(gcd(i,j)) leq p] ]

其中其中(h(x))表示一个数质因数分解后质数的个数。例如:(12=2×2*3),那么(h(12)=3)
题解:
非常有意思的一题。
首先大力化式子(与前面所有题目方法类似):

[Ans = sum_{T=1}^n lfloor frac{n}{T} floor lfloor frac{m}{T} floor sum_{d|T} [h(d) leq p] mu(frac{T}{d}) = sum_{T=1}^n lfloor frac{n}{T} floor lfloor frac{m}{T} floor R(p,T) ]

考虑如何求(R(p,T))

[R(p,T) = sum_{d|T} [h(d) leq p] mu(frac{T}{d}) ]

发现在([1,n])中,(h(i) leq 18) , ((2^{18} = 262144) , (2^{19} = 524288)
所以就非常神奇了 , 当(18 < p)时,直接输出(n*m)即可。
所以只要处理(0 leq p leq 18)的前缀和即可。
这个还是比较简单的吧,分(3.5)步走:
(0)显然(h(i))在求(mu(i))时可以顺便求出来。
(1)埃氏筛处理(E(p,x) = sum_{d|T} [h(d) = p] mu(frac{T}{d}))
(2)统计一下(S(p,x) = sum_{i=1}^p E(i,x))
(3)统计一下(R(p,x) = sum_{i=1}^x S(p,i))
然后每次询问时直接调用(R(p,x)),接着数论分块即可。

11.[ZOJ3435]Ideal Puzzle Bobble

(具体题目戳我)
题目:求:

[sum_{i=1}^L sum_{j=1}^W sum_{k=1}^H[gcd(i,j,k)==1] ]

题解:
这题应该放到(Part1)里去的...

[Ans = sum_{i=1}^{min(L,W,H)} mu(i) lfloor frac{L}{i} floor lfloor frac{W}{i} floor lfloor frac{H}{i} floor ]

12.来历不明的火题:

题目:一组数据,给定(n,k)((n leq 10^7) , (k leq 10^5)) , 求:

[sum_{i=1}^n sum_{j=1}^m i^kj^k*gcd(i,j) ]

题解:
首先先打一个预防针:(q(i)=i^k)请线性筛好不然肯定会超时。
然后先化式子:

[Ans = sum_{d=1}^n d^{2k+1} sum_{i=1}^{lfloor frac{n}{d} floor} sum_{j=1}^{lfloor frac{n}{d} floor}[gcd(i,j)=1]i^kj^k = sum_{d=1}^n d^{2k+1} R(lfloor frac{n}{d} floor) ]

然后求解(R(x))

[f(d) = sum_{j=1}^{lfloor frac{n}{d} floor}[gcd(i,j)=d]i^kj^k ]

所以构造倍数形式莫比乌斯:

[F(d) = sum_{j=1}^{n}[d|gcd(i,j)]i^kj^k = sum_{d=1}^{n}d^{2k}sum_{i=1}^{lfloor frac{n}{d} floor}sum_{j=1}^{lfloor frac{n}{d} floor}i^kj^k ]

上面这步是关键(提出(d)),然后继续化:

[F(d) = sum_{d=1}^{n}d^{2k}sum_{i=1}^{lfloor frac{n}{d} floor}i^k *sum_{j=1}^{lfloor frac{n}{d} floor}j^k = sum_{d=1}^n d^{2k} *[sum(frac{n}{d})]^2 ; ]

其中(sum(d))为乘法前缀和,预处理一下即可。
接着就可以莫比乌斯反演了:

[R(n) = f(1) = sum_{d=1}^n mu(d) F(d) = sum_{d=1}^n mu(d) d^{2k} sum(lfloor frac{n}{d} floor) ; ]

[Ans = sum_{d=1}^n d^{2k+1} R(lfloor frac{n}{d} floor) ]

注意一下$x{2k}=(xk)^2 ; x^{2k+1} = x^{2k}*x $ , 不能用快速幂。
显然两边都可以数论分块,(O(n))计算即可 , 注意常数问题。

Part INF

这里总结一下套路:
(1)遇见(id)形式,换元提出(T=id)

[Sample=sum_{d=1}^n sum_{i=1}^{lfloor frac{n}{d} floor}mu({i}) lfloor frac{n}{id} floor = sum_{T=1}^n lfloor frac{n}{T} floor sum_{d|T}mu(frac{T}{d}) ]

那么后面那一坨就很有可能可以线性筛、分块(或者搞事情)之类的。
(2)构造(F(d))时提出公因子(d)

[Sample = F(d) = sum_{j=1}^{n}[d|gcd(i,j)]ij = sum_{d=1}^{n}dsum_{i=1}^{lfloor frac{n}{d} floor}sum_{j=1}^{lfloor frac{n}{d} floor}ij= sum_{d=1}^{n}d(sum_{i=1}^{lfloor frac{n}{d} floor}i)^2 ]

然后后面的一坨一般就比较好算了,从而达到化简式子的目的。

原文地址:https://www.cnblogs.com/GuessYCB/p/8277359.html