这里讲述几个莫比乌斯反演的套路技巧。我们从一道道例题讲起。
- \(\sum_{i=1}^{n}\sum_{j=1}^{n} [gcd(i,j)=1]=\sum_{i=1}^n \mu(i)\lfloor \frac{n}{i}\rfloor^2\)
这就是一般公式 \([gcd(i,j)=1]=\sum_{d|i,d|j}^n \mu(d)\) 的衍生,不会做不了题。
- 暴力算 \(\gcd\) 转换为枚举最大公约数
例题1 P2568 GCD
给定正整数 \(n\),求 \(1\le x,y\le n\) 且 \(\gcd(x,y)\) 为素数的数对 \((x,y)\) 有多少对。
思路点拨
如果我们暴力的去枚举一个个 \(x,y\) ,缓慢的算出 \(\gcd\) 之后还判断是不是素数,这样会超时。但是我们转念一想,我们可以枚举 \(\gcd\) 的那么素数
\[\sum_{i=1}^n\sum_{j=1}^n[\gcd(i,j)\in S_{prime}] \]\[=\sum_{d\in S_{prime},d\leqslant n} \sum_{i=1}^n\sum_{j=1}^n [\gcd (i,j)=d] \]\[=\sum_{d\in S_{prime},d\leqslant n} \sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}[\gcd(i,j)=1] \]接下来就会有两种做法,欧拉函数或者莫反,这里讲述莫反,就是套上述的套路一。
\[=\sum_{d\in S_{prime},d\leqslant n} \sum_{i=1}^{\lfloor\frac{n}{d}\rfloor} \mu(i)\lfloor \frac{n}{id}\rfloor^2 \]这样运用富比尼定理就可以 \(O(n\sqrt n)\) 了。但是不可以通过。
- 令 \(T=id\) 并且枚举T
这样往往可以优化时间。
\[=\sum_{T=1}^{n}\lfloor \frac{n}{T}\rfloor^2\sum_{d\in S_{prime},d|T}\mu(\frac{T}{d}) \]左边富比尼定理,右边筛法算就可以了。
-
分母分子分开算
-
\(lcm\) 转 \(\gcd\)
有时候我们需要计算的东西是一堆分数的乘积并且取余数,那么就可以这样降低思考难度。
例题二 P5221 Product
\[\prod_{i=1}^N\prod_{j=1}^N\frac{lcm(i,j)}{gcd(i,j)}\ (\bmod\ 104857601) \]我们知道,在膜意义下的运算,分母是会被运用欧拉定理转化为幂的形式的,所以有交配律,原式就可以被转化为:
\[=\frac{\prod_{i=1}^N\prod_{j=1}^Nlcm(i,j)}{\prod_{i=1}^N\prod_{j=1}^Ngcd(i,j)}\ (\bmod\ 104857601) \]莫反不好考虑 \(lcm\) ,转化为 \(gcd\) :
\[=\frac{\prod_{i=1}^N\prod_{j=1}^Nij}{\prod_{i=1}^N\prod_{j=1}^Ngcd^2(i,j)}\ (\bmod\ 104857601) \]分开考虑,先从简单的分子下手:
\[\prod_{i=1}^N\prod_{j=1}^N ij=\prod_{i=1}^N i^N (n!)^N=(n!)^{2N} \]在考虑分母,平方先去掉,最后再一起算。
\[=\prod_{i=1}^N\prod_{j=1}^Ngcd(i,j) \]我们按照上边的套路,取枚举 \(\gcd\) ,原式可以转化为:
\[=\prod_{d=1}^{N}d^{\sum_{i=1}^n\sum_{j=1}^n [\gcd(i,j)=d]} \]考虑幂次的部分,记得欧拉降幂不然会WA:
\[\sum_{i=1}^n\sum_{j=1}^n [\gcd(i,j)=d]=\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor} [\gcd(i,j)=1] \]这个东东欧拉函数算就可以了。但是莫比乌斯函数也不是不行。
最后我们讲一道略难的综合题。
例题三 [SDOI2017]数字表格
题目背景
Doris 刚刚学习了 fibonacci 数列。用 \(f_i\) 表示数列的第 \(i\) 项,那么
\[f_0=0,f_1=1 \]\[f_n=f_{n-1}+f_{n-2},n\geq 2 \]题目描述
Doris 用老师的超级计算机生成了一个 \(n\times m\) 的表格,
第 \(i\) 行第 \(j\) 列的格子中的数是 \(f_{\gcd(i,j)}\),其中 \(\gcd(i,j)\) 表示 \(i,j\) 的最大公约数。
Doris 的表格中共有 \(n\times m\) 个数,她想知道这些数的乘积是多少。
答案对 \(10^9+7\) 取模。
思路点拨
我们知道,斐波拉契数列这东西一下求这么多和并不好算,但是因为 \(n,m \leqslant 10^6\) ,所以最多只会有 \(10^6\) 个数被访问,我们直接想到枚举下标。
\[\prod_{d=1}^{n}f_{d}^{\sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)=d]} \]- 套路把 \(d\) 给提出来(之前都用了很多遍了)
注意,这里是体现莫比乌斯函数优越性的地方了,应为 \(n,m\) 不相等,所以欧拉函数就不好算了。我们把分母拎出来,并且使用公式 :
\[\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}[\gcd(i,j)=1]= \sum_{t=1}^{\lfloor\frac{n}{d}\rfloor}\mu(\lfloor\frac{n}{d}\rfloor)\lfloor\frac{n}{td}\rfloor \lfloor\frac{m}{td}\rfloor \]带入原式中,并且使用 \(T=td\) 替换:
\[=\prod_{d=1}^{n}f_{d}^{\sum_{t=1}^{\lfloor\frac{n}{d}\rfloor}\mu(t)\lfloor\frac{n}{td}\rfloor \lfloor\frac{m}{td}\rfloor} \]\[=\prod_{T=1}^{n}(\prod_{d|T}f_{d}^{\mu(\frac{T}{d})})^{\lfloor\frac{n}{T}\rfloor \lfloor\frac{m}{T}\rfloor} \]括号里面的就预处理,一个筛法,随便写。外面的根幂次有关的就考虑富比尼定理求解。时间复杂度 \(O(n \log n+T\sqrt n)\)
在知道了上面的小套路之后,简单的莫反(紫左右)大部分是可以写了。
下面再给出一些综合运用的例题:
- 这题中涉及到了另一个有意思的想法就是通过对序列中的数计数而转化为更一般的问题,请读者自行探索。有一点难。