前言:
本题表中,凡是涉及\(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} \rfloor} \sum_{j=1}^{\lfloor \frac{m}{d} \rfloor} [gcd(i,j)=1] = \sum_{i=1}^{\lfloor \frac{n}{d} \rfloor} \mu(i)\lfloor \frac{\lfloor \frac{n}{d} \rfloor}{i} \rfloor * \lfloor \frac{\lfloor \frac{m}{d} \rfloor}{i} \rfloor
\]
数论分块,然后二维容斥即可。
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} \rfloor} \sum_{j=1}^{\lfloor \frac{m}{d} \rfloor} [gcd(i,j)=1]
\]
枚举\(d\),然后用第1题的方法搞即可。
3.Gcd
(具体题目戳我)
题目:一组数据,给定整数\(N(N\leq10^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} d\sum_{i=1}^{\lfloor \frac{n}{d} \rfloor} \sum_{j=1}^{\lfloor \frac{m}{d} \rfloor} [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} \rfloor\)
反演一下:
\[f(1) = \sum_{i=1}^{\lceil \sqrt{n} \rceil } \lfloor \frac{n}{i^2} \rfloor
\]
直接数论分块即可得到一个数\(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} \rfloor} \sum_{i=1}^{\lfloor \frac{m}{d} \rfloor} ij*[gcd(i,j)=1]*d^2
\]
带回原式中:
\[Ans = \sum_{d=1}^n d*f({\lfloor \frac{n}{d} \rfloor},{\lfloor \frac{m}{d} \rfloor},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} \rfloor} \sum_{i=1}^{\lfloor \frac{m}{d} \rfloor} ij= \sum_{n|d} f(d)
\]
反演一下:
\[f(i) = \sum_{i|d}\mu(\frac{d}{i})F(d) , f(1) = \sum_{d=1}^n\mu(d)F(d) = \sum_{d=1}^n\mu(d) \sum_{i=1}^{{\lfloor \frac{n}{d} \rfloor}} \sum_{j=1}^{\lfloor \frac{m}{d} \rfloor} 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} \rfloor},{\lfloor \frac{m}{d} \rfloor},1)
\]
\[f({n},{m},1) = \sum_{d=1}^n\mu(d) \frac{\lfloor \frac{n}{d} \rfloor*(\lfloor \frac{n}{d} \rfloor+1)}{2} * \frac{\lfloor \frac{m}{d} \rfloor*(\lfloor \frac{m}{d} \rfloor+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} \rfloor \lfloor \frac{m}{v} \rfloor
\]
令
\[f(d) = \sum_{u=1}^n \sum_{v=1}^m [gcd(u,v)=d] \lfloor \frac{n}{u} \rfloor \lfloor \frac{m}{v} \rfloor
\]
同理令
\[F(d) = \sum_{u=1}^n \sum_{v=1}^m [d|gcd(u,v)] \lfloor \frac{n}{u} \rfloor \lfloor \frac{m}{v} \rfloor = \sum_{u=1}^{\lfloor \frac{n}{d} \rfloor}\sum_{u=1}^{\lfloor \frac{m}{d} \rfloor} \lfloor \frac{n}{ud} \rfloor \lfloor \frac{m}{vd} \rfloor
\]
所以
\[F(d) = \sum_{u=1}^{\lfloor \frac{n}{d} \rfloor}\sum_{u=1}^{\lfloor \frac{m}{d} \rfloor} \lfloor \frac{n}{ud} \rfloor \lfloor \frac{m}{vd} \rfloor = \sum_{u=1}^{\lfloor \frac{n}{d} \rfloor} \lfloor \frac{n}{ud} \rfloor *\sum_{u=1}^{\lfloor \frac{m}{d} \rfloor} \lfloor \frac{m}{vd} \rfloor = sum(\lfloor \frac{n}{d} \rfloor)*sum(\lfloor \frac{m}{d} \rfloor)
\]
其中\(sum(x)=\sum_{i=1}^{x} \lfloor \frac{x}{i} \rfloor\)表示\(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} \rfloor)*sum(\lfloor \frac{m}{i} \rfloor) = Ans
\]
其中$$sum(x)=\sum_{i=1}^{x} \lfloor \frac{x}{i} \rfloor$$
显然先 数论分块 预处理\(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} \rfloor} \sum_{j=1}^{\lfloor \frac{m}{d} \rfloor} [gcd(i,j)=1]}
\]
上面那一坨提出来看(直接跳步骤了)
\[\sum_{i=1}^{\lfloor \frac{n}{d} \rfloor} \sum_{j=1}^{\lfloor \frac{m}{d} \rfloor} [gcd(i,j)=1] = \sum_{i=1}^{\lfloor \frac{n}{d} \rfloor} \mu(i) {\lfloor \frac{n}{id} \rfloor} {\lfloor \frac{m}{id} \rfloor} = r(\lfloor \frac{n}{d} \rfloor,\lfloor \frac{m}{d} \rfloor)
\]
\[Ans = \prod_{d=1}^n f(d)^{r(\lfloor \frac{n}{d} \rfloor,\lfloor \frac{m}{d} \rfloor)}
\]
显然\(Ans\)与\(r(n,m)\)的求解都可以数论分块,此时复杂度为\(O(n)\)可以跑过单组数据。
但是我们有多组数据,考虑如何优化。
看到\(id\),是不是感觉很套路?令\(T = id\) , 那么我们把\(T\)给提出来:
\[\prod_{d=1}^n f(d)^{\sum_{i=1}^{\lfloor \frac{n}{d} \rfloor} \mu(i) {\lfloor \frac{n}{T} \rfloor} {\lfloor \frac{m}{T} \rfloor}} = \prod_{T=1}^n(\prod_{d|T} f(d)^{\mu(\frac{T}{d})})^{{\lfloor \frac{n}{T} \rfloor} {\lfloor \frac{m}{T} \rfloor}}
\]
令
\[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} \rfloor} {\lfloor \frac{m}{T} \rfloor}} = \prod_{T=1}^nR(T)^{{\lfloor \frac{n}{T} \rfloor} {\lfloor \frac{m}{T} \rfloor}}
\]
显然\(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 x\leq N\) , \(1 \leq y\leq M\) ,且\(Gcd(x,y)\)为素数的组数。
题解:
其实就是第三题《\(GCD\)》的升级版。
前面的步骤直接跳过:
\[Ans = \sum_{d=1}^n \sum_{i=1}^{\lfloor \frac{n}{d} \rfloor} \mu(i) \lfloor \frac{n}{id} \rfloor \lfloor \frac{m}{id} \rfloor
\]
老套路,令\(T = id\),提出\(T\):
\[\sum_{d=1}^n \sum_{i=1}^{\lfloor \frac{n}{d} \rfloor} \mu(i) \lfloor \frac{n}{id} \rfloor \lfloor \frac{m}{id} \rfloor = \sum_{T=1}^n \sum_{d|T} \mu(\frac{T}{d}) \lfloor \frac{n}{T} \rfloor \lfloor \frac{m}{T} \rfloor = \sum_{T=1}^n\lfloor \frac{n}{T} \rfloor \lfloor \frac{m}{T} \rfloor \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 d\sum_{i=1}^{\lfloor \frac{n}{d} \rfloor} \mu(i) {\lfloor \frac{n}{id} \rfloor }^2
\]
还是老套路(套路就是这么神奇),令\(T = id\),提出\(T\):
\[Ans' = \sum_{T=1}^n \sum_{d|T} \mu(\frac{T}{d}) {\lfloor \frac{n}{T} \rfloor }^2 d = \sum_{T=1}^n {\lfloor \frac{n}{T} \rfloor }^2\sum_{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} \rfloor \lfloor \frac{m}{T} \rfloor \sum_{d|T} [h(d) \leq p] \mu(\frac{T}{d}) = \sum_{T=1}^n \lfloor \frac{n}{T} \rfloor \lfloor \frac{m}{T} \rfloor 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} \rfloor \lfloor \frac{W}{i} \rfloor \lfloor \frac{H}{i} \rfloor
\]
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} \rfloor} \sum_{j=1}^{\lfloor \frac{n}{d} \rfloor}[gcd(i,j)=1]i^kj^k = \sum_{d=1}^n d^{2k+1} R(\lfloor \frac{n}{d} \rfloor)
\]
然后求解\(R(x)\):
\[f(d) = \sum_{j=1}^{\lfloor \frac{n}{d} \rfloor}[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}\rfloor}\sum_{j=1}^{\lfloor \frac{n}{d}\rfloor}i^kj^k
\]
上面这步是关键(提出\(d\)),然后继续化:
\[F(d) = \sum_{d=1}^{n}d^{2k}\sum_{i=1}^{\lfloor \frac{n}{d}\rfloor}i^k *\sum_{j=1}^{\lfloor \frac{n}{d}\rfloor}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} \rfloor) \ ;
\]
\[Ans = \sum_{d=1}^n d^{2k+1} R(\lfloor \frac{n}{d} \rfloor)
\]
注意一下$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} \rfloor}\mu({i}) \lfloor \frac{n}{id} \rfloor = \sum_{T=1}^n \lfloor \frac{n}{T} \rfloor \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}d\sum_{i=1}^{\lfloor \frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor \frac{n}{d}\rfloor}ij= \sum_{d=1}^{n}d(\sum_{i=1}^{\lfloor \frac{n}{d}\rfloor}i)^2
\]
然后后面的一坨一般就比较好算了,从而达到化简式子的目的。