数论分块与 Möbius 反演学习笔记
xk2013
·
2026-07-24 14:44:12
·
算法·理论
前言
笔者学习 Möbius 反演时,由于网络上的各种资料有时候光给出性质,而不给出证明,让笔者难以理解,原因是我太菜了,为了造福后人,写下了这篇文章,因此也融入了自己对 Möbius 反演的一些体会和方法论,希望能够帮助大家更好地理解这一知识点。
本文中所有的数默认都为正整数 ,共 24870 字,有点长,可以分块食用。
数论分块的概念与性质
数论分块是分块(即答)。
数论分块虽然并不是传统数据结构中所说的“分块”,但是也沿用了分块的思想。
数论分块一般用来算这种求和:
\sum\limits_{i=1}^nf(i)g\left(\left\lfloor\dfrac{n}{i}\right\rfloor\right)
其中 f(i) 的前缀和通常是可以快速计算或者是可以预处理的。
那么数论分块的“分块”到底在哪里呢?藏在右边这个下取整这里。容易发现下取整会让其变成一块一块的。
性质一 :\left\lfloor\dfrac{n}{i}\right\rfloor 只有不超过 2\sqrt n 种取值,即只有 \Omicron(\sqrt n) 种取值,进而只有 \Omicron(\sqrt n) 个“块”。
:::success[证明]
考虑分类讨论。
当 i \le \sqrt n 时,因为 i 只有 \sqrt n 种取值,因此 \left\lfloor\dfrac{n}{i}\right\rfloor 也只有不超过 \sqrt n 种取值;
当 i > \sqrt n 时,显然有 1 \le \left\lfloor\dfrac{n}{i}\right\rfloor \le \sqrt n ,即此时 \left\lfloor\dfrac{n}{i}\right\rfloor 也只有不超过 \sqrt n 种取值。
综上所述,\left\lfloor\dfrac{n}{i}\right\rfloor 只有不超过 2\sqrt n 种取值,证毕。
:::
性质二 :若存在取值 d ,则使得 \left\lfloor\dfrac{n}{i}\right\rfloor = d 的 i 取值范围为 \left\lfloor\dfrac{n}{d+1}\right\rfloor + 1 \le i \le \left\lfloor\dfrac{n}{d}\right\rfloor 。
:::success[证明]
倒过来可得 $\dfrac{1}{d + 1} < \dfrac{i}{n} \le \dfrac{1}{d}$,同时乘 $n$ 得 $\dfrac{n}{d + 1} < i \le \dfrac{n}{d}$。
由于 $i$ 是正整数,因此有 $\left\lfloor\dfrac{n}{d+1}\right\rfloor < i \le \left\lfloor\dfrac{n}{d}\right\rfloor$,即 $\left\lfloor\dfrac{n}{d+1}\right\rfloor + 1 \le i \le \left\lfloor\dfrac{n}{d}\right\rfloor$。
证毕。
:::
**性质二**让我们可以快速确定左右端点 $l, r$($l$ 为上一块右端点加 $1$,$r = \left\lfloor\dfrac{n}{\left\lfloor\dfrac{n}{l}\right\rfloor}\right\rfloor$)。确定了块端点后,这一块对答案的贡献即为:
$$\sum\limits_{i=l}^rf(i)g\left(\left\lfloor\dfrac{n}{l}\right\rfloor\right) = g\left(\left\lfloor\dfrac{n}{i}\right\rfloor\right)\sum\limits_{i=l}^rf(i)$$
由于后面已经预处理好了,所以这个式子可以 $\Omicron(1)$ 计算,而总共只有 $\Omicron(\sqrt n)$ 块,因此计算的时间复杂度即为 $\Omicron(\sqrt n)$。
## Möbius 函数及其性质
大家都知道 Möbius 函数 $\mu(n)$:
记 $\mathbb P$ 为质数集合,设 $n$ 的质因数分解形式为 $\displaystyle n = \prod\limits_{p_i \in \mathbb P} p_i^{k_i}$,$c$ 为非零的 $k_i$ 个数。则:
$$\mu(n) = \begin{cases}
0, &\exists k_i \ge 2\\
(-1)^c, &\text{otherwise.}
\end{cases}$$
$\mu(n)$ 显然是积性函数。$\mu(n)$ 有如下性质:
**性质一**:$\displaystyle\sum\limits_{d~\vert~ n} \mu(d) = [n = 1] = \varepsilon(n)$。
:::success[证明]
当 $n = 1$ 时,性质显然成立。下面我们讨论 $n > 1$ 的情况。
记 $\displaystyle F(n) = \sum\limits_{d~\vert~ n} \mu(d) = (\mu \ast 1)(n)$。由 Dirichlet 卷积的性质,两个积性函数的 Dirichlet 卷积还是一个积性函数,因此 $F(n)$ 是积性函数。
设 $n$ 的质因数分解形式为 $\displaystyle n = \prod\limits_{p_i \in \mathbb P} p_i^{k_i}$。则我们有 $\displaystyle F(n) = \prod\limits_{p_i\in \mathbb P} F(p_i^{k_i})$。
考虑:
$$
\begin{aligned}
F(p_i^{k_i})
&= \sum\limits_{d~\vert~ p_i^{k_i}} \mu(d)\\
&= \sum\limits_{j = 0}^{k_i} \mu(p_i^j)\\
&= \mu(1) + \mu(p) + \mu(p^2) + \cdots\\
&= \mu(1) + \mu(p)\\
&= 1 + (-1)\\
&= 0
\end{aligned}
$$
因此 $F(n) = 0$($n > 1$)。由 Dirichlet 卷积单位元 $\varepsilon(n)$ 的定义,有 $\varepsilon(n) = [n = 1] = F(n)$,证毕。
:::
**性质二**:$\displaystyle\sum\limits_{d~\vert~n}\dfrac{\mu(d)}{d} = \dfrac{\varphi(n)}{n}$。
:::success[证明]
由 Dirichlet 卷积的**结论**,$\varphi = \mu \ast \operatorname{id}$,展开得到:
$$\varphi(n) = \sum\limits_{d ~\vert~ n} \mu(d)\operatorname{id}(\dfrac{n}{d}) = n\sum\limits_{d ~\vert~ n} \dfrac{\mu(d)}{d}$$
左右各除以一个 $n$ 即得到原式,证毕。
:::
有了这些性质,我们就可以来探究 Möbius 反演了,顺便还能知道 Möbius 函数 $\mu(n)$ 是怎么来的。
## Möbius 反演及其应用
首先假装我们有一个数论函数 $f(n)$,且 $f \ast 1 = F$(即 $\displaystyle F(n) = \sum\limits_{d~\vert~n}f(d)$),那么我们有:
$$f(n) = \sum\limits_{d~\vert~n}\mu(d)F(\dfrac{n}{d})$$
这种逆变换被我们称为 **Möbius 反演**。
:::success[证明]
我们选择直接暴力展开。
$$
\begin{aligned}
\sum\limits_{d~\vert~n}\mu(d)F(\dfrac{n}{d})
&= \sum\limits_{d~\vert~n}\mu(d)\sum\limits_{k~\vert~\dfrac{n}{d}}f(k)\\
&= \sum\limits_{dk~\vert~n}\mu(d)f(k)\\
&= \sum\limits_{dk~\vert~n}\mu(k)f(d)\\
&= \sum\limits_{d~\vert~n}f(d)\sum\limits_{k~\vert~\dfrac{n}{d}}\mu(k)\\
&= \sum\limits_{d~\vert~n}f(d)[\dfrac{n}{d}=1]\\
&= \sum\limits_{d~\vert~n}f(d)[d=n]\\
&= f(n)
\end{aligned}
$$
第一步是按照定义展开,第三步交换了求和顺序,是数论证明中常用的手法。第五步用了 Möbius 函数的**性质一**。
证毕。
:::
其实这才是 Möbius 函数 $\mu(n)$ 原本的定义。
那么 Möbius 反演到底有什么用处呢?我们来做点例题。
先来一道开胃小菜。
----------------------
### [例题 1:BZOJ #3561. DZY Loves Math VI](https://darkbzoj.cc/problem/3561)
:::info[如果你打不开题:简要题意]{open}
给定 $n, m$,求:
$$\sum\limits_{i=1}^n\sum\limits_{j=1}^m \operatorname{lcm}(i, j)^{\gcd(i, j)}$$
其中 $\operatorname{lcm}(i, j)$ 表示 $i, j$ 的最小公倍数,$\gcd(i, j)$ 表示 $i, j$ 的最大公因数。
数据范围:$1 \le n, m \le 5 \times 10^5$。
:::
在推式子前,我们不妨假定 $n \le m$,如果不满足交换即可,不影响答案。
然后开始我们的推式子环节:
$$
\begin{aligned}
\sum\limits_{i=1}^n\sum\limits_{j=1}^m \operatorname{lcm}(i, j)^{\gcd(i, j)}
&=\sum\limits_{d=1}^n\sum\limits_{i=1}^n\sum\limits_{j=1}^m \left(\dfrac{ij}{d}\right)^d[\gcd(i, j) = d]\\
&= \sum\limits_{d=1}^n\sum\limits_{i=1}^{\left\lfloor\dfrac{n}{d}\right\rfloor}\sum\limits_{j=1}^{\left\lfloor\dfrac{m}{d}\right\rfloor} (ijd)^d[\gcd(i, j) = 1]\\
&= \sum\limits_{d=1}^nd^d\sum\limits_{i=1}^{\left\lfloor\dfrac{n}{d}\right\rfloor}\sum\limits_{j=1}^{\left\lfloor\dfrac{m}{d}\right\rfloor} (ij)^d[\gcd(i, j) = 1]\\
&= \sum\limits_{d=1}^nd^d\sum\limits_{i=1}^{\left\lfloor\dfrac{n}{d}\right\rfloor}\sum\limits_{j=1}^{\left\lfloor\dfrac{m}{d}\right\rfloor} (ij)^d\sum\limits_{k~\vert~\gcd(i, j)}\mu(k)\\
&= \sum\limits_{d=1}^nd^d\sum\limits_{i=1}^{\left\lfloor\dfrac{n}{d}\right\rfloor}\sum\limits_{j=1}^{\left\lfloor\dfrac{m}{d}\right\rfloor} (ij)^d\sum\limits_{k~\vert~i, k~\vert~j}\mu(k)\\
&= \sum\limits_{d=1}^nd^d\sum\limits_{i=1}^{\left\lfloor\dfrac{n}{d}\right\rfloor}\sum\limits_{j=1}^{\left\lfloor\dfrac{m}{d}\right\rfloor} \sum\limits_{k~\vert~i, k~\vert~j}(ij)^d\mu(k)\\
&= \sum\limits_{d=1}^nd^d\sum\limits_{k=1}^{\left\lfloor\dfrac{n}{d}\right\rfloor}\mu(k)\sum\limits_{i=1}^{\left\lfloor\dfrac{n}{dk}\right\rfloor}\sum\limits_{j=1}^{\left\lfloor\dfrac{m}{dk}\right\rfloor} (ijk^2)^d\\
&= \sum\limits_{d=1}^nd^d\sum\limits_{k=1}^{\left\lfloor\dfrac{n}{d}\right\rfloor}k^{2d}\mu(k)\sum\limits_{i=1}^{\left\lfloor\dfrac{n}{dk}\right\rfloor}i^d\sum\limits_{j=1}^{\left\lfloor\dfrac{m}{dk}\right\rfloor}j^d\\
&= \sum\limits_{d=1}^nd^d\sum\limits_{k=1}^{\left\lfloor\dfrac{n}{d}\right\rfloor}k^{2d}\mu(k)S_d\left(\left\lfloor\dfrac{n}{dk}\right\rfloor\right)S_d\left(\left\lfloor\dfrac{m}{dk}\right\rfloor\right)
\end{aligned}
$$
其中 $\displaystyle S_d(n) = \sum\limits_{i=1}^n i^d$ 被称为**自然数幂和**,使用 $\Omicron(n \log n)$ 朴素的快速幂直接算。
来对上面的推式子做一些解释:
1. 第一步枚举了最大公因数,这是数论问题常用的处理方法;
2. 第二步我们其实做了个换元,将 $i' = id$,$j' = jd$ 然后提取出来;
3. 第三步交换求和顺序,没什么好说的;
4. 第四步利用了 Möbius 函数的**性质一**,将互质的条件巧妙地消掉了。这也是 Möbius 函数**性质一**如此重要的原因;
5. 第七步又是一个换元,相信大家能够看懂;
对于其他式子中的项,$\mu(k)$ 可以线性筛 $\Omicron(n)$ 预处理,其他带 $d$ 次方的可以快速幂或者动态维护。让我们来算下复杂度:
:::warning[复杂度分析,可以跳过]
$$
\begin{aligned}
T(n)
&= \sum\limits_{d=1}^n\sum\limits_{k=1}^{\left\lfloor\dfrac{n}{d}\right\rfloor}\Omicron\left(\left\lfloor\dfrac{n}{dk}\right\rfloor \log \left\lfloor\dfrac{n}{dk}\right\rfloor\right)\\
&\le \Omicron(\log n) \sum\limits_{d=1}^n\sum\limits_{k=1}^{\left\lfloor\dfrac{n}{d}\right\rfloor}\Omicron\left(\left\lfloor\dfrac{n}{dk}\right\rfloor\right)\\
&= \Omicron(n \log n)\sum\limits_{d=1}^n\Omicron\left(\dfrac{1}{d}\right)\sum\limits_{k=1}^{\left\lfloor\dfrac{n}{d}\right\rfloor}\Omicron\left(\dfrac{1}{k}\right)\\
&= \Omicron(n \log n)\sum\limits_{d=1}^n\Omicron\left(\dfrac{1}{d} \log \dfrac{n}{d}\right)\\
&= \Omicron(n \log n)~\Omicron(\log^2 n)\\
&= \Omicron(n \log^3 n)
\end{aligned}
$$
:::
$\Omicron(n \log^3 n)$!天哪竟然是惊人的三只 $\log$!~~这肯定过不去~~,我们考虑优化。发现我们可以在枚举 $k$ 之前预处理当前的 $S_d(n)$,而不是每次枚举一个 $k$ 又算一遍,可以去掉一个 $\log$ 变成 $\Omicron(n \log^2 n)$,[可以跑过去了](https://darkbzoj.cc/submission/284103)。
当然我们还可以优化。我们只需要当每次 $d$ 增加的时候,递推 $i^d$ 的值($i^d = i^{d - 1} \times i$),这样只会增加 $\displaystyle\sum\limits_{d=1}^n \Omicron\left(\left\lfloor\dfrac{n}{d}\right\rfloor\right) = \Omicron(n \log n)$ 的代价,而去掉了快速幂的一只 $\log$,可以做到 $\Omicron(n \log n)$ 的时间复杂度,~~反正我是不会写的~~。
这个题很适合作为 Möbius 反演的第一道入门题,~~能让你感受到推式子的魅力~~。
----------------------
### [例题 2:洛谷 P2522 [HAOI2011] Problem b](/problem/P2522)
有了前面的经验,先请读者自行思考一下再继续往下读。
----------------------
我们发现求和有上下界,不是很好处理。那就干脆直接把它容斥掉!
记 $\displaystyle f(n, m, k) = \sum\limits_{i = 1}^n\sum\limits_{j=1}^m[\gcd(i, j) = k]$。于是本题的答案即为 $f(b, d, k) - f(b, c - 1, k) - f(a - 1, d, k) + f(a - 1, c - 1, k)$。我们只需要考虑一下 $\displaystyle f(n, m, k) = \sum\limits_{i = 1}^n\sum\limits_{j=1}^m[\gcd(i, j) = k]$ 怎么算就行了。
不妨设 $n \le m$,显然交换 $n, m$ 不影响 $f(n, m, k)$。按照前面的套路,我们进行推式子:
$$
\begin{aligned}
f(n, m, k)
&= \sum\limits_{i = 1}^n\sum\limits_{j=1}^m[\gcd(i, j) = k]\\
&= \sum\limits_{i=1}^{\left\lfloor\dfrac{n}{k}\right\rfloor}\sum\limits_{j=1}^{\left\lfloor\dfrac{m}{k}\right\rfloor}[\gcd(i, j) = 1]\\
&= \sum\limits_{i=1}^{\left\lfloor\dfrac{n}{k}\right\rfloor}\sum\limits_{j=1}^{\left\lfloor\dfrac{m}{k}\right\rfloor}\sum\limits_{d~\vert~\gcd(i, j)} \mu(d)\\
&= \sum\limits_{d=1}^{\left\lfloor\dfrac{n}{k}\right\rfloor}\mu(d)\sum\limits_{i=1}^{\left\lfloor\dfrac{n}{dk}\right\rfloor}\sum\limits_{j=1}^{\left\lfloor\dfrac{m}{dk}\right\rfloor}1\\
&= \sum\limits_{d=1}^{\left\lfloor\dfrac{n}{k}\right\rfloor}\mu(d)\left\lfloor\dfrac{n}{dk}\right\rfloor\left\lfloor\dfrac{m}{dk}\right\rfloor
\end{aligned}
$$
推到这里已经可以做到 $\Omicron(n)$ 了,但是可恶的出题人开了多组数据,$\Omicron(Tn)$ 很可能过不去。我们注意到 $\left\lfloor\dfrac{n}{dk}\right\rfloor = \left\lfloor\dfrac{\left\lfloor\dfrac{n}{d}\right\rfloor}{k}\right\rfloor$,$m$ 也是同理,而分子上的都是常数。
看到这个你想到了什么?对,数论分块!利用数论分块我们就可以轻松做到 $\Omicron(T\sqrt{n})$ 的优秀复杂度了。[复杂度很优秀,但是有容斥的 $4$ 倍常数](/record/288333941)。
----------------------
### [例题 3:洛谷 P2257 YY的GCD](/problem/P2257)
相信经过前两题的历练,你应该已经掌握了一些推式子的技巧了吧!
~~推式子是不是很好玩,很爽?~~
这道题跟上一道题有相似之处,先自己推推看式子吧。
----------------------
我们依然可以套路化地枚举 $\gcd$,但是这次的枚举范围变成了质数集合 $\mathbb P$。
不妨设 $n \le m$,我们来推柿子:
$$
\begin{aligned}
\sum\limits_{i=1}^n\sum\limits_{j=1}^m[\gcd(i, j) \in \mathbb P]
&= \sum\limits_{p\in\mathbb P\cap[1, n]}\sum\limits_{i=1}^n\sum\limits_{j=1}^m[\gcd(i, j) = p]\\
&= \sum\limits_{p\in\mathbb P\cap[1, n]}\sum\limits_{i=1}^{\left\lfloor\dfrac{n}{p}\right\rfloor}\sum\limits_{j=1}^{\left\lfloor\dfrac{m}{p}\right\rfloor}[\gcd(i, j) = 1]\\
&= \sum\limits_{p\in\mathbb P\cap[1, n]}\sum\limits_{i=1}^{\left\lfloor\dfrac{n}{p}\right\rfloor}\sum\limits_{j=1}^{\left\lfloor\dfrac{m}{p}\right\rfloor}\sum\limits_{k ~\vert~ \gcd(i, j)}\mu(k)\\
&= \sum\limits_{p\in\mathbb P\cap[1, n]}\sum\limits_{k=1}^{\left\lfloor\dfrac{n}{p}\right\rfloor}\mu(k)\sum\limits_{i=1}^{\left\lfloor\dfrac{n}{pk}\right\rfloor}\sum\limits_{j=1}^{\left\lfloor\dfrac{m}{pk}\right\rfloor} 1\\
&= \sum\limits_{p\in\mathbb P\cap[1, n]}\sum\limits_{k=1}^{\left\lfloor\dfrac{n}{p}\right\rfloor}\left\lfloor\dfrac{n}{pk}\right\rfloor\left\lfloor\dfrac{m}{pk}\right\rfloor\mu(k)\\
\end{aligned}
$$
看起来这个式子已经非常的友好了,算一下暴力算的复杂度 $\Omicron\left(\displaystyle\sum\limits_{p\in\mathbb P\cap [1, n]}\left\lfloor\dfrac{n}{p}\right\rfloor\right) = \Omicron(n \log \log n)$(这个式子其实跟埃氏筛的复杂度一模一样)。
但是!又有多组数据,而且 $T = 10^4$,这显然跑不过去,哎呀这个题怎么这么坏。套路地,我们依旧考虑数论分块。但是这里还有一维枚举质数的去不掉,没法直接数论分块……所以还得继续推!
$$
\begin{aligned}
\sum\limits_{i=1}^n\sum\limits_{j=1}^m[\gcd(i, j) \in \mathbb P]
&= \sum\limits_{p\in\mathbb P\cap[1, n]}\sum\limits_{k=1}^{\left\lfloor\dfrac{n}{p}\right\rfloor}\left\lfloor\dfrac{n}{pk}\right\rfloor\left\lfloor\dfrac{m}{pk}\right\rfloor\mu(k)\\
&= \sum\limits_{k=1}^{\left\lfloor\dfrac{n}{2}\right\rfloor}\sum\limits_{p\in\mathbb P\cap[1, \left\lfloor\dfrac{n}{k}\right\rfloor]}\left\lfloor\dfrac{n}{pk}\right\rfloor\left\lfloor\dfrac{m}{pk}\right\rfloor\mu(k)\\
&= \sum\limits_{t=1}^n\left\lfloor\dfrac{n}{t}\right\rfloor\left\lfloor\dfrac{m}{t}\right\rfloor\sum\limits_{p ~\vert ~t, p\in\mathbb P\cap[1, n]} \mu\left(\dfrac{t}{p}\right)
\end{aligned}
$$
我们观察到后面这个 $F(t) = \displaystyle\sum\limits_{d ~\vert ~t, d\in\mathbb P} \mu\left(\dfrac{t}{d}\right)$ 看起来非常积性,然而并非。比如:$F(2)F(3)\ne F(6)$。那咋办?
有一个非常 naive 的想法,在埃氏筛的过程中,对于每个质数 $p$,给它的每个倍数 $kp$ 的值 $F(kp)$ 加上 $\mu(k)$。这显然是对的,只需要反过来考虑贡献就可以了,于是我们就会 $\Omicron(n \log \log n + T\sqrt{n})$ 了,显然能过。
当然我们还有更快的做法。虽然 $F(n)$ 不是积性函数,但是 $F(n)$ 居然是可以用线性筛的!我们考虑分类讨论。
1. 当 $n = 1$ 时,显然 $F(n) = 0$;
2. 当 $n \in \mathbb P$ 时,$F(n) = \mu\left(\dfrac{n}{n}\right) = \mu(1) = 1$;
3. 当 $n \not \in \{1\} \cup \mathbb P$ 时,我们考虑线性筛的过程(设现在枚举到 $i$,$p$ 是存储质数的数组,正在筛 $n= i \times p_j$):
- 当 $p_j~\vert~i$ 时,有 $p_j^2 ~\vert~ n$,而由于 $p_j$ 是质数,当 $d \ne p_j$ 时 $\mu\left(\dfrac{n}{d}\right) = 0$(n 含有 $p_j^2$ 的因子),仅当 $d = p_j$ 时才有取值,因此 $F(n) = \mu\left(\dfrac{n}{p_j}\right) = \mu(i)$;
- 否则,$i$ 和 $p_j$ 一定互质,利用 $\mu(n)$ 是积性函数的性质,$F(n) = \displaystyle\sum\limits_{d ~\vert ~n, d\in\mathbb P} \mu\left(\dfrac{ip_j}{d}\right) = \left(\displaystyle\sum\limits_{d ~\vert ~i, d\in\mathbb P} \mu\left(\dfrac{ip_j}{d}\right)\right) + \mu\left(\dfrac{ip_j}{p_j}\right) = \mu(p_j)\left(\displaystyle\sum\limits_{d ~\vert ~i, d\in\mathbb P} \mu\left(\dfrac{i}{d}\right)\right) + \mu(i) = \mu(i) - F(i)$。
于是就可以线性筛了,因此本题能够做到 $\Omicron(n + T\sqrt{n})$,[但是为啥还是跑的这么慢](/record/288418942)。
----------------------
### [例题 4:洛谷 P2260 [清华集训 2012] 模积和](/problem/P2260)
为了防止你学 Möbius 反演学魔怔了,看到 $\displaystyle\sum$ 就想 Möbius 反演~~反了你了~~,于是在这里放了一道不用 Möbius 反演的数论分块。
式子里有个 $i \ne j$ 不是很好处理,考虑拆出来,然后化成整除形式。推式子的时候暂且不考虑取模,假设 $n \le m$。
$$
\begin{aligned}
\sum\limits_{i=1}^n\sum\limits_{j=1}^m(n \bmod i)(m \bmod j)[i \ne j]
&= \left(\sum\limits_{i=1}^n\sum\limits_{j=1}^m(n \bmod i)(m \bmod j)\right) - \left(\sum\limits_{i=1}^n\sum\limits_{j=1}^m(n \bmod i)(m \bmod j)[i = j]\right)\\
&= \left(\sum\limits_{i=1}^n\sum\limits_{j=1}^m(n \bmod i)(m \bmod j)\right) - \left(\sum\limits_{i=1}^n(n \bmod i)(m \bmod i)\right)\\
&= \left(\sum\limits_{i=1}^n\sum\limits_{j=1}^m\left(n - i\left\lfloor\dfrac{n}{i}\right\rfloor\right)\left(m - j\left\lfloor\dfrac{m}{j}\right\rfloor\right)\right) - \left(\sum\limits_{i=1}^n\left(n - i\left\lfloor\dfrac{n}{i}\right\rfloor\right)\left(m - i\left\lfloor\dfrac{m}{i}\right\rfloor\right)\right)\\
&= \left(\sum\limits_{i=1}^n\left(n - i\left\lfloor\dfrac{n}{i}\right\rfloor\right)\right)\left(\sum\limits_{j=1}^m\left(m - j\left\lfloor\dfrac{m}{j}\right\rfloor\right)\right) - \left(\sum\limits_{i=1}^n\left(n - i\left\lfloor\dfrac{n}{i}\right\rfloor\right)\left(m - i\left\lfloor\dfrac{m}{i}\right\rfloor\right)\right)\\
&= \left(\sum\limits_{i=1}^n \left(n - i\left\lfloor\dfrac{n}{i}\right\rfloor\right)\right)\left(\sum\limits_{i=1}^m \left(m - i\left\lfloor\dfrac{m}{i}\right\rfloor\right)\right) - \left(\sum\limits_{i=1}^n\left(n - i\left\lfloor\dfrac{n}{i}\right\rfloor\right)\left(m - i\left\lfloor\dfrac{m}{i}\right\rfloor\right)\right)\\
&= \left(n^2-\sum\limits_{i=1}^n i\left\lfloor\dfrac{n}{i}\right\rfloor\right)\left(m^2-\sum\limits_{i=1}^m i\left\lfloor\dfrac{m}{i}\right\rfloor\right) - n^2m + n\left(\sum\limits_{i=1}^n i\left\lfloor\dfrac{m}{i}\right\rfloor\right)+m\left(\sum\limits_{i=1}^n i\left\lfloor\dfrac{n}{i}\right\rfloor\right)-\left(\sum\limits_{i=1}^n i^2\left\lfloor\dfrac{n}{i}\right\rfloor\left\lfloor\dfrac{m}{i}\right\rfloor\right)\\
\end{aligned}
$$
很好,看起来每一项都很容易数论分块了。但是有一点要注意,我们如何计算 $\displaystyle\sum\limits_{i=1}^n i^2$?
学过小学奥数的应该都知道一个熟知结论:
$$\sum\limits_{i=1}^n i^2=\dfrac{n(n+1)(2n+1)}{6}$$
:::success[构造与证明]{open}
数学归纳法是显然的,但是我和你们一样也想知道这个式子是怎么从头推出来的。
首先处理这种前缀和的式子有一种惯用的手法。
令 $f(k) = k^2$,我们所求的即为 $f(k)$ 的前缀和。我们考虑构造 $g(k)$ 使得 $g(k + 1) - g(k) = f(k)$。这样有什么好处呢?
把这个式子代回原来的求和:
$$
\begin{aligned}
\sum\limits_{i=1}^n i^2
&= \sum\limits_{k=1}^n f(k)\\
&= \sum\limits_{k=1}^n \left(g(k + 1) - g(k)\right)\\
&= g(n + 1) - g(1)
\end{aligned}
$$
容易发现这样能够使得相邻两项互相抵消,只留下两项 $g(n + 1) - g(1)$,变得容易计算。
因此我们只需要考虑构造 $g(k)$ 即可。由于 $f(k)$ 是一个二次多项式,因此我们猜测 $g(k)$ 是一个三次多项式。我们使用待定系数法,设 $g(k) = ak^3 + bk^2 + ck + d$,我们有:
$$
\begin{aligned}
g(k+1)-g(k)
&= a(3k^2+3k+1)+b(2k+1)+c\\
&= 3ak^2 + (3a+2b)k + (a+b+c)\\
&= k^2
\end{aligned}
$$
比较系数容易得出:
$$
\begin{cases}
3a=1\\
3a+2b=0\\
a+b+c=0\\
\end{cases}
$$
因此 $g(k) = \dfrac{1}{3}k^3-\dfrac{1}{2}k^2+\dfrac{1}{6}k+d$($d$ 可以为任意值)是一个合法的构造。这里我们取 $d = 0$,即 $g(k) = \dfrac{1}{3}k^3-\dfrac{1}{2}k^2+\dfrac{1}{6}k = \dfrac{k(k-1)(2k-1)}{6}$。
代回原求和式,即:
$$
\begin{aligned}
\sum\limits_{i=1}^n i^2
&= \sum\limits_{k=1}^n f(k)\\
&= \sum\limits_{k=1}^n \left(g(k + 1) - g(k)\right)\\
&= g(n + 1) - g(1)\\
&= \dfrac{n(n+1)(2n+1)}{6} - \dfrac{1 \times 0 \times 1}{6}\\
&= \dfrac{n(n+1)(2n+1)}{6}
\end{aligned}
$$
证毕。
当然我们可以沿用上述思路,直接算 $\displaystyle \sum\limits_{i=l}^r i^2$:
$$
\begin{aligned}
\sum\limits_{i=l}^r i^2
&= \sum\limits_{k=l}^r f(k)\\
&= \sum\limits_{k=l}^r \left(g(k + 1) - g(k)\right)\\
&= g(r + 1) - g(l)\\
&= \dfrac{r(r+1)(2r+1)}{6} - \dfrac{l(l - 1)(2l - 1)}{6}\\
&= \dfrac{r(r+1)(2r+1) - l(l - 1)(2l - 1)}{6}
\end{aligned}
$$
或者说你直接差分也行。
:::
有了这个,那我们直接数论分块就好了。时间复杂度 $\Omicron(\sqrt{n} + \sqrt{m})$,可以轻松通过,[跑得飞快](/record/288521690)。
----------------------
上面这些题,不同循环枚举变量都是分开的,那如果 $i, j$ “粘”在一起该怎么处理呢?
----------------------
### [例题 5:洛谷 P3327 [SDOI2015] 约数个数和](/problem/P3327)
题目让我们求 $\displaystyle\sum\limits_{i=1}^n\sum\limits_{j=1}^m d(ij)$,$i, j$ 被放在一个括号里没法直接拆,怎么办呢?
我们考虑一下 $d(ij)$ 能表示成什么。由于约数函数 $d(n)$ 是积性函数,我们可以对于单个质数 $p$ 考虑:设 $p$ 在 $i$ 中指数为 $a$,在 $j$ 中指数为 $b$。显然此时 $ij$ 的因数中 $p$ 的指数有 $a + b + 1$ 种情况。考虑枚举 $i$ 的因数 $x$ 和 $j$ 的因数 $y$,但是此时 $xy$ 中 $p$ 的指数有 $(a + 1)(b + 1)$ 种情况,这显然是不对的。怎么凑出 $a + b + 1$?我们只需要限定 $x, y$ 中只能有至多一个数有 $p$ 因子即可,这等价于 $\gcd(x, y) = 1$。
所以我们有:
$$d(ij) = \sum\limits_{x~\vert~i}\sum\limits_{y~\vert~j}[\gcd(x, y) = 1]$$
我知道这有点难理解,我也有点理解不了,你可以多读几遍,~~或者想我一样想不懂就背下来~~,这已经是我能想到最通俗易懂的一种解释了。
假装 $n \le m$,我们就可以开始愉快地推式子了:
$$
\begin{aligned}
\sum\limits_{i=1}^n\sum\limits_{j=1}^m d(ij)
&= \sum\limits_{i=1}^n\sum\limits_{j=1}^m\sum\limits_{x~\vert~i}\sum\limits_{y~\vert~j}[\gcd(x, y) = 1]\\
&= \sum\limits_{i=1}^n\sum\limits_{j=1}^m\sum\limits_{x~\vert~i}\sum\limits_{y~\vert~j}\sum\limits_{d~\vert~\gcd(x, y)} \mu(d)\\
&= \sum\limits_{d=1}^n\sum\limits_{i=1}^{\left\lfloor\dfrac{n}{d}\right\rfloor}\sum\limits_{j=1}^{\left\lfloor\dfrac{m}{d}\right\rfloor}\sum\limits_{x=1}^{\left\lfloor\dfrac{n}{di}\right\rfloor}\sum\limits_{y=1}^{\left\lfloor\dfrac{m}{dj}\right\rfloor}\mu(d)\\
&= \sum\limits_{d=1}^n\mu(d)\sum\limits_{i=1}^{\left\lfloor\dfrac{n}{d}\right\rfloor}\left\lfloor\dfrac{n}{di}\right\rfloor\sum\limits_{j=1}^{\left\lfloor\dfrac{m}{d}\right\rfloor}\left\lfloor\dfrac{m}{dj}\right\rfloor &\begin{cases}p\gets\left\lfloor\dfrac{n}{d}\right\rfloor\\q\gets\left\lfloor\dfrac{m}{d}\right\rfloor\end{cases}\\
&= \sum\limits_{d=1}^n\mu(d)\sum\limits_{i=1}^{p}\left\lfloor\dfrac{p}{i}\right\rfloor\sum\limits_{j=1}^{q}\left\lfloor\dfrac{q}{j}\right\rfloor&S(n)\gets\sum\limits_{i=1}^{n}\left\lfloor\dfrac{n}{i}\right\rfloor\\
&= \sum\limits_{d=1}^n\mu(d)S(p)S(q)\\
&= \sum\limits_{d=1}^n\mu(d)S(\left\lfloor\dfrac{n}{d}\right\rfloor)S(\left\lfloor\dfrac{m}{d}\right\rfloor)
\end{aligned}
$$
注意到 $\mu(n)$ 可以线性筛预处理,$S(n)$ 我们可以用 $\Omicron(n\sqrt n)$ 数论分块预处理,然后再假装 $S(n)$ 是一个数论函数,回答询问的时候,再用一个数论分块进行计算即可,~~什么数论分块套数论分块~~。
时间复杂度为 $\Omicron((n + T) \sqrt n)$,可恶的出题人只开了 1s,很有可能过不去。
我们注意到,其实有 $\displaystyle\sum\limits_{i=1}^n\left\lfloor\dfrac{n}{i}\right\rfloor = \sum\limits_{i=1}^nd(i)$。
:::success[证明]
我们考虑发动传统技能:

我们考虑等式左边干了啥。我们发现左边其实是在数有序数对 $(i, j)$($1 \le i \le n$,$1 \le j \le \left\lfloor\dfrac{n}{i}\right\rfloor$)的个数。也就是 $1 \le ij \le n$ 的有序数对 $(i, j)$ 个数。
然后我们考虑等式右边干了啥。首先右边显然数了有序数对 $(d, i)$($1 \le i \le n$,$d ~\vert~ i$)的数量。但是这里有个整除不好处理,考虑转换成倍数形式。我们转为枚举 $d$,令 $i = kd$,于是等价于数有序数对 $(d, k)$($1\le kd \le n$)。
我们发现数有序数对 $(i, j)$($1 \le ij \le n$)的个数和数有序数对 $(d, k)$($1\le i = kd \le n$)是等价的,证毕。
:::
于是用线性筛预处理 $d(n)$ 可以做到 $O(n + T\sqrt n)$,[轻松通过](/record/288576830)。
----------------------
### [例题 6:洛谷 P4619 [SDOI2018] 旧试题](/problem/P4619)
做了这么多题,我们就用这道题目来总结一下 Möbius 反演的各种惯用方法吧。
看到这个 $d(ijk)$ 你是不是想到了什么?对,可以照葫芦画瓢地展开:
$$
d(ijk) = \sum\limits_{x~\vert~i}\sum\limits_{y~\vert~j}\sum\limits_{z~\vert~k}[\gcd(x,y)=1][\gcd(y,z)=1][\gcd(z,x)=1]
$$
然后我们带回原式,假装 $A \le B \le C$,进行 Möbius 反演(推导过程忽略模数):
$$
\begin{aligned}
\sum\limits_{i=1}^A\sum\limits_{j=1}^B\sum\limits_{k=1}^Cd(ijk)
&= \sum\limits_{i=1}^A\sum\limits_{j=1}^B\sum\limits_{k=1}^C\sum\limits_{x~\vert~i}\sum\limits_{y~\vert~j}\sum\limits_{z~\vert~k}[\gcd(x,y)=1][\gcd(y,z)=1][\gcd(z,x)=1]\\
&= \sum\limits_{i=1}^A\sum\limits_{j=1}^B\sum\limits_{k=1}^C\sum\limits_{x~\vert~i}\sum\limits_{y~\vert~j}\sum\limits_{z~\vert~k}\sum\limits_{a~\vert~\gcd(x,y)}\sum\limits_{b~\vert~\gcd(y,z)}\sum\limits_{c~\vert~\gcd(z,x)}\mu(a)\mu(b)\mu(c)\\
&= \sum\limits_{i=1}^A\sum\limits_{x~\vert~i}\sum\limits_{j=1}^B\sum\limits_{y~\vert~j}\sum\limits_{k=1}^C\sum\limits_{z~\vert~k}\sum\limits_{a~\vert~\gcd(x,y)}\sum\limits_{b~\vert~\gcd(y,z)}\sum\limits_{c~\vert~\gcd(z,x)}\mu(a)\mu(b)\mu(c)\\
&= \sum\limits_{x=1}^A\sum\limits_{i=1}^{\left\lfloor\dfrac{A}{x}\right\rfloor}\sum\limits_{y=1}^B\sum\limits_{j=1}^{\left\lfloor\dfrac{B}{y}\right\rfloor}\sum\limits_{z=1}^C\sum\limits_{k=1}^{\left\lfloor\dfrac{C}{z}\right\rfloor}\sum\limits_{a~\vert~\gcd(x,y)}\sum\limits_{b~\vert~\gcd(y,z)}\sum\limits_{c~\vert~\gcd(z,x)}\mu(a)\mu(b)\mu(c)\\
&= \sum\limits_{x=1}^A\sum\limits_{y=1}^B\sum\limits_{z=1}^C\left\lfloor\dfrac{A}{x}\right\rfloor\left\lfloor\dfrac{B}{y}\right\rfloor\left\lfloor\dfrac{C}{z}\right\rfloor\sum\limits_{a~\vert~\gcd(x,y)}\sum\limits_{b~\vert~\gcd(y,z)}\sum\limits_{c~\vert~\gcd(z,x)}\mu(a)\mu(b)\mu(c)\\
&= \sum\limits_{x=1}^A\sum\limits_{y=1}^B\sum\limits_{z=1}^C\sum\limits_{a~\vert~x,a~\vert~y}\sum\limits_{b~\vert~y,b~\vert~z}\sum\limits_{c~\vert~z,c~\vert~x}\left\lfloor\dfrac{A}{x}\right\rfloor\left\lfloor\dfrac{B}{y}\right\rfloor\left\lfloor\dfrac{C}{z}\right\rfloor\mu(a)\mu(b)\mu(c)\\
&= \sum\limits_{a=1}^A\sum\limits_{b=1}^B\sum\limits_{c=1}^C\sum\limits_{a~\vert~x,c~\vert~x}\sum\limits_{a~\vert~y,b~\vert~y}\sum\limits_{b~\vert~z,c~\vert~z}\left\lfloor\dfrac{A}{x}\right\rfloor\left\lfloor\dfrac{B}{y}\right\rfloor\left\lfloor\dfrac{C}{z}\right\rfloor\mu(a)\mu(b)\mu(c)\\
&= \sum\limits_{a=1}^A\sum\limits_{b=1}^B\sum\limits_{c=1}^C\mu(a)\mu(b)\mu(c)\sum\limits_{\operatorname{lcm}(c,a)~\vert~x}\sum\limits_{\operatorname{lcm}(a,b)~\vert~y}\sum\limits_{\operatorname{lcm}(b,c)~\vert~z}\left\lfloor\dfrac{A}{x}\right\rfloor\left\lfloor\dfrac{B}{y}\right\rfloor\left\lfloor\dfrac{C}{z}\right\rfloor&\begin{cases}u\gets\dfrac{x}{\operatorname{lcm}(c,a)}\\v\gets\dfrac{y}{\operatorname{lcm}(a,b)}\\w\gets\dfrac{z}{\operatorname{lcm}(b,c)}\end{cases}\\
&= \sum\limits_{a=1}^A\sum\limits_{b=1}^B\sum\limits_{c=1}^C\mu(a)\mu(b)\mu(c)\sum\limits_{u=1}^{\left\lfloor\dfrac{A}{\operatorname{lcm}(c,a)}\right\rfloor}\sum\limits_{v=1}^{\left\lfloor\dfrac{B}{\operatorname{lcm}(a,b)}\right\rfloor}\sum\limits_{w=1}^{\left\lfloor\dfrac{C}{\operatorname{lcm}(b,c)}\right\rfloor}\left\lfloor\dfrac{A}{u\operatorname{lcm}(c,a)}\right\rfloor\left\lfloor\dfrac{B}{v\operatorname{lcm}(a,b)}\right\rfloor\left\lfloor\dfrac{C}{w\operatorname{lcm}(b,c)}\right\rfloor\\
&= \sum\limits_{a=1}^A\sum\limits_{b=1}^B\sum\limits_{c=1}^C\mu(a)\mu(b)\mu(c)\sum\limits_{u=1}^{\left\lfloor\dfrac{A}{\operatorname{lcm}(c,a)}\right\rfloor}\left\lfloor\dfrac{{\left\lfloor\dfrac{A}{\operatorname{lcm}(c,a)}\right\rfloor}}{u}\right\rfloor\sum\limits_{v=1}^{\left\lfloor\dfrac{B}{\operatorname{lcm}(a,b)}\right\rfloor}\left\lfloor\dfrac{{\left\lfloor\dfrac{B}{\operatorname{lcm}(a,b)}\right\rfloor}}{v}\right\rfloor\sum\limits_{w=1}^{\left\lfloor\dfrac{C}{\operatorname{lcm}(b,c)}\right\rfloor}\left\lfloor\dfrac{{\left\lfloor\dfrac{C}{\operatorname{lcm}(b,c)}\right\rfloor}}{w}\right\rfloor&S(n)\gets\sum\limits_{i=1}^n\left\lfloor\dfrac{n}{i}\right\rfloor\\
&= \sum\limits_{a=1}^A\sum\limits_{b=1}^B\sum\limits_{c=1}^C\mu(a)\mu(b)\mu(c)S(\left\lfloor\dfrac{A}{\operatorname{lcm}(c,a)}\right\rfloor)S(\left\lfloor\dfrac{B}{\operatorname{lcm}(a,b)}\right\rfloor)S(\left\lfloor\dfrac{C}{\operatorname{lcm}(b,c)}\right\rfloor)
\end{aligned}
$$
根据我们先前的结论,$\displaystyle S(n) = \sum\limits_{i=1}^nd(i)$,可以线性筛预处理。
其实这道题的推式子部分到这里已经结束了,接下来我们考虑一下怎么算。
:::info[暴力]
我会暴力枚举三元组!
那你前面在反演什么?你这不白反演了。
时间复杂度 $\Omicron(n^3)$,期望得分 $0$ 分。
:::
:::success[正解]{open}
观察到 $\mu(a)\mu(b)\mu(c)$ 很容易是 $0$,因此实际上对答案有贡献的式子不多。
我们可以考虑图论建模。
- 考虑有什么点:显然 $\mu(u) = 0$ 的点 $u$ 对答案没有贡献,把这些点扔了。
- 考虑有什么边:对于结点 $u, v$,如果 $\operatorname{lcm}(u, v) \le A$(不然贡献为 $0$),我们就在他们之间连边。
考虑怎么连边。我们可以枚举 $\gcd(u, v)$,然后枚举互质的两个 $x, y$($x < y$,$xy\gcd(u,v) = \operatorname{lcm}(u, v \le A$),在 $x\gcd(u,v)$ 和 $y\gcd(u,v)$ 之间连边。
显然边数是 $\Omicron(m) = \Omicron(n \log^2 n)$ 级别的。但是如果你实际建一个图你会发现严重建不满,图非常稀疏,$m$ 只有大约 $7.1 \times 10^5$。
然后这个题就变成了一个无向图三元环计数问题,可以做到 $\Omicron(m\sqrt m)$。注意一个三元环要六个排列分别统计,然后就做完了。
:::
作为一道黑题,难度还是很高的。
### 总结
Möbius 反演常用化简方法:
1. 含有 $\gcd$ 的式子,枚举 $\gcd$ 把内层化成一个计数;
2. 枚举某个数的因数,可以直接转换成枚举上下界;
3. 交换求和顺序;
4. 利用 Möbius 反演的**性质一**,把 Iverson 括号拆成求和形式;
5. 基于 1 和 4 的扩展,可以枚举 Iverson 括号里的东西,把 Iverson 括号转换成形如 $[f(n)=1]$ 的形式;
6. 把式子拆成可以数论分块的形式,加速求和;
7. 有时候多换元能够更加容易观察出式子的性质。
希望这篇学习笔记能够更好地帮助你理解 Möbius 反演!~~在省选赛场上爆切紫题~~。
## 致谢
感谢各个题的题解作者以及 OI-wiki 上 Möbius 反演页面的贡献者们。
感谢音游 Phigros && Rizline 和独立游戏 Rain World 的各个 OST 提供的精神支持(?)