前置知识:数论分块、狄利克雷卷积
莫比乌斯函数
莫比乌斯函数的符号是 \(\mu\),定义为
-
规定 \(\mu(1)=1\)。
-
当 \(n\ne 1\) 时,将 \(n\) 分解质因数:\(n=p_1^{\alpha_1}p_2^{\alpha_2}\cdots p_k^{\alpha_k}\)。
- 若每个质因子均只出现一次(所有 \(\alpha_i\) 都为 1),则 \(\mu(n)=(-1)^k\);
- 否则,\(n\) 有平方因子(存在 \(d^2|n\)),此时 \(\mu(n)=0\)。
一些性质(证明略):
-
\(\mu\) 是积性函数。
这意味着 \(\mu\) 可以线性筛求。 -
\(\sum\limits_{d\mid n}\mu(d)=[n=1]\)。
非常有用非常重要的性质。
狄利克雷卷积
我们定义函数 \(f(n),g(n)\) 的狄利克雷卷积为
狄利克雷卷积满足交换律、结合律。
两个积性函数的狄利克雷卷积也是积性函数。
设 \(\varepsilon(n)=[n=1],I(n)=1,id(n)=n\)。我们还有如下结论:
-
\(f*\varepsilon=f\)(其中 \(f\) 为任意数论函数)。即 \(\varepsilon\) 是狄利克雷卷积的单位元。
-
\(\mu*I=\varepsilon\)。也就是 \(\sum\limits_{d\mid n}\mu(n)=[n=1]\)。即 \(\mu\) 和 \(I\) 互为逆元。
根据这条结论我们可以得到\[f=g*I\Longleftrightarrow g=f*\mu \]或者写成
\[f(n)=\sum_{d\mid n}g(n)\Longleftrightarrow g(n)=\sum_{d\mid n}\mu(d)f\Big(\frac nd\Big) \]这种操作被称为莫比乌斯反演。
-
\(\varphi*I=id\)。也就是 \(\sum\limits_{d\mid n}\varphi(d)=n\)。
莫比乌斯反演
内容上面讲过了,这里写一下实际做题时怎么用。
题意:求 \(\sum\limits_{i=1}^A\sum\limits_{j=1}^B[(i,j)=d]\)。
\(1\le A,B\le 10^6,1\le d\le\min(A,B)\)。
首先给出常用套路:\([(i,j)=1]=\sum\limits_{t|(i,j)}\mu(t)=\sum\limits_{t|i,t|j}\mu(t)\)。
接下来就是推式子了。
为了方便,约定 \(x/y\) 表示整除,即 \(\lfloor\tfrac xy\rfloor\)。
\(x/yz\) 的意思是 \(\lfloor\tfrac x{yz}\rfloor\) 而不是 \(\lfloor\tfrac xy\rfloor z\)。
\(\begin{aligned} \sum_{i=1}^A\sum_{j=1}^B[(i,j)=d] &=\sum_{i=1}^{A/d}\sum_{j=1}^{B/d}[(i,j)=1]\\ &=\sum_{i=1}^{A/d}\sum_{j=1}^{B/d}\sum_{t|(i,j)}\mu(t)\\ &=\sum_{t=1}^{\min(A,B)/d}\mu(t)\sum_{i=1}^{A/d}[t|i]\sum_{j=1}^{B/d}[t|j]\\ &=\sum_{t=1}^{\min(A,B)/d}\mu(t)(A/dt)(B/dt) \end{aligned}\)
\(\mu\) 可以线性筛求。这样我们就得到了 \(O(\min(A,B)/d)\) 的正解。
洛谷P1829 [国家集训队]Crash的数字表格 / JZPTAB
求 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^m{\rm lcm}(i,j)\) 的值。
答案可能比较大,所以对 \(20101009\) 取模。
\(1\le n,m\le 10^7\)。
式子中出现 \(\rm lcm\) 时一般要化为 \(\gcd\) 处理。
令 \(N=\min(n,m)\)。
\(\begin{aligned} \sum_{i=1}^n\sum_{j=1}^m{\rm lcm}(i,j) &=\sum_{d=1}^N\sum_{i=1}^n\sum_{j=1}^m[(i,j)=d]\frac{ij}d \\ &=\sum_{d=1}^Nd\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}[(i,j)=1]ij \\ &=\sum_{d=1}^Nd\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}\sum_{t|i,t|j}\mu(t)ij\\ &=\sum_{d=1}^Nd\sum_{t=1}^{N/d}\mu(t)\sum_{i=1}^{n/d}[t|i]i\sum_{j=1}^{m/d}[t|j]j\\ &=\sum_{d=1}^Nd\sum_{t=1}^{N/d}\mu(t)t^2S(n/dt)S(m/dt) \end{aligned}\)
其中 \(S(n)=\dfrac{n(n+1)}2\)。
最后的式子可以用两层数论分块计算。
时间复杂度瓶颈在线性筛求 \(\mu\) 的部分,为 \(O(N)\)。
欧拉反演
(其实这个名字好像并不怎么正式)
大部分莫反题都是用 \(\sum\limits_{d\mid n}\mu(d)\) 代换式子中出现的 \([n=1]\)。
但在某些情形下,存在另一种做法:用 \(\sum\limits_{d\mid n}\varphi(d)\) 代换式子里的 \(n\)。
求 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^m2\gcd(i,j)-1\)。
\(1\le n,m\le 10^5\)。
令 \(S=\sum\limits_{i=1}^n\sum\limits_{j=1}^m\gcd(i,j)\),则答案为 \(2S-nm\)。只需求出 \(S\) 即可。
令 \(N=\min(n,m)\)。
常规做法第一步是将式子化为 \(\sum\limits_{d=1}^Nd\sum\limits_{i=1}^n\sum\limits_{j=1}^m[(i,j)=d]\),然后用莫反推。但其实用欧拉反演会更简单:
\(\sum\limits_{i=1}^n\sum\limits_{j=1}^m\gcd(i,j) =\sum\limits_{i=1}^n\sum\limits_{j=1}^m\sum\limits_{d\mid i,d\mid j}\varphi(d) =\sum\limits_{d=1}^N\varphi(d)(n/d)(m/d)\)
线性筛求 \(\varphi\) 即可做到 \(O(N)\) 计算。
可以看出,适当使用欧拉反演代替莫反可以简化运算。
但相对莫反而言,欧拉反演的适用范围较小,一般只能用于解决 \(\gcd\) 求和之类的问题。
比如我们把 \(\sum\) 换成 \(\prod\),得到 \(\prod\limits_{i=1}^n\prod\limits_{j=1}^m\gcd(i,j)\) 这种累乘式,欧拉反演就不可做了。
此时正解是在指数上做莫反。
\(T\) 组数据,求 \(\prod\limits_{i=1}^n\prod\limits_{j=1}^mF_{\gcd(i,j)}\) 的值。
其中 \(F\) 为 Fibonacci 数列,\(F_1=F_2=1\)。对 \(10^9+7\) 取模。
\(1\le T\le 10^3,1\le n,m\le 10^6\)。
设 \(N=\min(n,m)\)。
\(\begin{aligned} \prod_{i=1}^n\prod_{j=1}^mF_{\gcd(i,j)} &=\prod_{d=1}^NF_d^{\sum_{i=1}^{n/d}~\sum_{j=1}^{m/d}~~[(i,j)=1]} \\ &=\prod_{d=1}^NF_d^{\sum_{t=1}^{N/d}~~\mu(t)(n/dt)(m/dt)}\\ &=\prod_{T=1}^N\left(\prod_{d\mid T}F_d^{\mu(T/d)}\right)^{(n/T)(m/T)} \end{aligned}\)
最后一步是一个常用技巧,令 \(T=dt\) 后变换求和(积)号。
括号内的部分可以预处理,复杂度是调和级数 \(O(n\ln n)\)。
然后数论分块计算即可。总时间复杂度 \(O(n\ln n+T\sqrt n\log n)\)。
莫比乌斯反演的扩展
我们定义一种运算 \(\oplus\) 如下:
这种运算显然既不满足交换律,也不满足结合律,似乎很逊。但它有一个神奇的性质:
其中 \(*\) 为狄利克雷卷积。
证明比较简单,读者可自行完成。
然后我们就有了一种奇怪的莫比乌斯反演:
也可以写成
其实也没啥特别的,取个对数就变成普通莫反了…
这里再补充一种非卷积形式的莫比乌斯反演:
这里要求 \(t\) 是完全积性函数,即无论 \(a,b\) 是否互质,\(t(ab)=t(a)t(b)\) 都成立。
同理有
瞎扯部分
写一点自己对莫反的理解
笔者学习莫反时曾有过这样的疑惑:为什么一堆莫反题都只是在用 \(\sum\limits_{d|n}\mu(d)=[n=1]\) 推式子,所谓的反演到底体现在哪里呢?
比如说 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^m[(i,j)=1]=\sum\limits_{d=1}^{\min(n,m)}\mu(d)(n/d)(m/d)\),我们考虑怎样才能让它和反演扯上关系。
把上面提到的莫反的非卷积形式魔改一下:
(正确性是可以证明的,但这不是重点,因此不再赘述)
令 \(f(n,m)=nm,g(n,m)=\sum\limits_{i=1}^n\sum\limits_{j=1}^m[(i,j)=1]\),则右式成立。
不妨看一下此时左式长啥样:\(\sum\limits_{d=1}^{\min(n,m)}~\sum\limits_{i=1}^{n/d}\sum\limits_{j=1}^{m/d}[(i,j)=1]=nm\)。
可以这样理解:对于每一个数对 \((x,y)\),将其按 \(d=\gcd(x,y)\) 分类,数对的总数恒为 \(nm\)。式子中的 \(i,j\) 对应了 \(x/d,y/d\)。
如果我们知道按 \(\gcd\) 分类的这种技巧,就可以直接得到左式,从而由莫反推出右式。
于是对于一道莫反题,我们有了两种做法:
- 用 \(\sum\limits_{d|n}\mu(d)=[n=1]\) 的性质做代换,然后变换求和号(推式子)。
- 用 \(\gcd\) 分类的思想弄出一个式子,然后做莫比乌斯反演。
例题:证明 \(\mu*id=\varphi\)。
(其实由 \(\varphi*I=id\) 反演一下即可得到,但我们假装这个性质不能用)
-
推式子。
\(\begin{aligned} \varphi(n)&=\sum\limits_{i=1}^n[(i,n)=1]\\ &=\sum\limits_{i=1}^n\sum\limits_{d|i,d|n}\mu(d)\\ &=\sum\limits_{d|n}\mu(d)(n/d) \end{aligned}\)
即 \(\varphi=\mu*id\)。 -
将 \(n\) 以内的正整数按 \(d=\gcd(i,n)\) 分类,得到
\(\begin{aligned} n&=\sum\limits_{d|n}\sum\limits_{i=1}^n[(i,n)=d]\\ &=\sum\limits_{d|n}\sum\limits_{i=1}^{n/d}[(i,n/d)=1]\\ &=\sum\limits_{d|n}\varphi(n/d)\\ &=\sum\limits_{d|n}\varphi(d) \end{aligned}\)
于是我们证明了 \(\varphi*I=id\),从而有 \(\mu*id=\varphi\)。
如果题目就是要证 \(\varphi*I=id\),解法 2 会明显更为简洁优美。
但相对而言解法 1 技巧性不强,实际做题时会更好用。
最后来欣赏一波牛逼操作(
令 \(f\) 为 \(\varepsilon\),得 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^m[(i,j)=1]=\sum\limits_{d=1}^{\min(n,m)}\mu(d)(n/d)(m/d)\),即洛谷P4450 双亲数。
令 \(f\) 为 \(id\),得 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^m\gcd(i,j)=\sum\limits_{d=1}^{\min(n,m)}\varphi(d)(n/d)(m/d)\),即洛谷P1447 [NOI2010] 能量采集。
设 \(F\) 为 Fibonacci 数列,且使用 \(\prod\) 形式的莫反,
令 \(f(n)=F_n\),得 \(\prod\limits_{i=1}^n\prod\limits_{j=1}^mF_{\gcd(i,j)}=\prod\limits_{d=1}^{\min(n,m)}(f\oplus\mu)(d)^{(n/d)(m/d)}\) ,即洛谷P3704 [SDOI2017]数字表格。