莫比乌斯反演学习笔记

· · 算法·理论

前言

2025/8/26 upd:修正了几处错误。

莫比乌斯反演,是一种使用莫比乌斯函数进行容斥,对原本复杂的数学式子进行推导,使其运算能够更快速的数学方法,在 NOI 大纲中被评为 9 级算法,但实际上并不是特别难。

但由于作者本人在学习莫反时走过许多弯路,同时为了纪念作者学会了莫比乌斯反演,所以写了这篇文章,希望对大家有所帮助!

请保证你在阅读本文前有一定的数论与高中数学基础。

莫比乌斯函数

想要学会莫反(莫比乌斯反演的简称),首先要知道莫比乌斯函数。它的定义域为 \N^*,其定义如下:

n 质因数分解,得 n=\prod\limits_{i=1}^m\normalsize p_i^{c_i},则 \mu(n)=\begin{cases}0&\exists\ i\in[1,m],c_i>1\\1&2\mid m,\forall\ i\in[1,m],c_i=1\\-1&2\nmid m,\forall\ i\in[1,m],c_i=1\end{cases}

特别的,有 \mu(1)=1

你可能会被这一坨式子吓坏,但没关系,接下来会详细讲解莫比乌斯函数。

首先看 \mu(n)=0 的情况。它的意思是说:有一个质因子,在 n 的质因数分解中出现了 2 次及以上,则说明 n平方因子。例如 4,其质因数分解为 2\times2,注意到 2 出现了两次,于是 4 内有平方因子,所以 \mu(4)=0

再看 \mu(n)=1 的情况。它是在说如果 n 内不存在平方因子,且质因数分解后 n 的质因数有偶数个,则 \mu(n)=1。例如 6,质因数分解后为 2\times3,不存在平方因子,且有偶数个质因子,所以 \mu(6)=1

最后看 \mu(n)=-1 的情况。其实与 \mu(n)=1 的情况相似,同样没有平方因子,但质因子有奇数个。例如 30,分解后得 2\times3\times5,不存在平方因子,且有奇数个质因子,所以 \mu(30)=-1;另外,所有质数的莫比乌斯函数值都为 -1,因为很显然,它们被分解后还是他们自身,质因子数量为 1,所以其莫比乌斯函数值都为 -1

其有一个重要的性质:\sum\limits_{d|n}\mu(d)=[n=1]

数论函数与狄利克雷卷积

数论函数

首先,你要知道什么是数论函数。

数论函数定义如下:

数论函数是定义域为 \N^*,值域为 \mathbb{C} 的子集的函数。

显然,上面提到的莫比乌斯函数就是一个数论函数,其定义域为 \N^*,值域为 \{-1,0,1\}

还有一些其他常见的数论函数:

另外,还有一些函数可以用来充作数论函数:

狄利克雷卷积

其定义如下:

对于两个数论函数 f(n),g(n),令它们的狄利克雷卷积结果为 (f*g)(n),则 (f*g)(n)=\sum\limits_{d|n}f(d)g(\frac{n}{d})

于是 \epsilon(n) 就成为了狄利克雷卷积的单位元,你可以用它和其他数论函数卷一下试试。

常见的狄利克雷卷积公式(一定要记牢了,不然忘了公式你会被创飞的!):

莫比乌斯反演与欧拉反演

莫比乌斯反演

说了那么多,是时候进入正题了。

莫比乌斯反演的原理其实就一句话:

g(n)=\sum_{d|n}f(d)\Longleftrightarrow f(n)=\sum_{d|n}\mu(\frac{n}{d})g(d)

但是光知道这玩意屁用没有,看见莫反题该不会还不会。于是,我将会用几道题让你慢慢学会莫反推式子的方法(只教推式子,不讲代码实现)。

例题 1 GCD SUM

\begin{aligned} &\ \ \ \ \sum_{i=1}^n\sum_{j=1}^n\gcd(i,j)\\ &=\sum_{i=1}^n\sum_{j=1}^n\sum_{d=1}^nd[\gcd(i,j)=d]\\ &=\sum_{d=1}^nd\sum_{i=1}^n\sum_{j=1}^n[\gcd(i,j)=d]\\ &=\sum_{d=1}^nd\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}[\gcd(i,j)=1]\\ &=\sum_{d=1}^nd\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{k|i,k|j}\mu(k)\\ &=\sum_{d=1}^nd\sum_{k=1}^{\lfloor\frac{n}{d}\rfloor}\mu(k)\sum_{i=1}^{\lfloor\frac{n}{kd}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{kd}\rfloor}1\\ &=\sum_{d=1}^nd\sum_{k=1}^{\lfloor\frac{n}{d}\rfloor}\mu(k)\lfloor\frac{n}{kd}\rfloor^2\\ &\ \ \ \ \ \ \ \ \ 令\ t=kd,则\\ 原式&=\sum_{t=1}^n\sum_{d|t}d\mu(\frac{t}{d})\lfloor\frac{n}{t}\rfloor^2\\ &=\sum_{t=1}^n\varphi(t)\lfloor\frac{n}{t}\rfloor^2 \end{aligned}

上面那个换元后换枚举顺序是一个很套路的方法,这样你能够将原来的式子写成狄利克雷卷积形式,在很多题目上都能方便处理,但你只要不会,你就会被卡死在那上面。(作者就因为这东西挂了好几次)

例题 2 [POI 2007] ZAP-Queries

以下默认 a\le b

\begin{aligned} &\ \ \sum_{i=1}^a\sum_{j=1}^b[\gcd(i,j)=d]\\ &\ 令\ n=\lfloor\frac{a}{d}\rfloor,m=\lfloor\frac{b}{d}\rfloor,则\\ 原式&=\sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)=1]\\ &=\sum_{i=1}^n\sum_{j=1}^m\sum_{t|i,t|j}\mu(t)\\ &=\sum_{t=1}^{n}\mu(t)\sum_{i=1}^{\lfloor\frac{n}{t}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{t}\rfloor}1\\ &=\sum_{t=1}^n\mu(t)\lfloor\frac{n}{t}\rfloor\lfloor\frac{m}{t}\rfloor \end{aligned}

例题 3 简单的数学题

\begin{aligned} &\ \ \ \ \ \sum_{i=1}^n\sum_{j=1}^nij\gcd(i,j)\\ &=\sum_{i=1}^n\sum_{j=1}^nij\sum_{d=1}^nd[\gcd(i,j)=d]\\ &=\sum_{d=1}^nd\sum_{i=1}^n\sum_{j=1}^nij[\gcd(i,j)=d]\\ &=\sum_{i=1}^nd^3\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}ij[\gcd(i,j)=1]\\ &=\sum_{d=1}^nd^3\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}ij\sum_{k|i,k|j}\mu(k)\\ &=\sum_{d=1}^nd^3\sum_{k=1}^{\lfloor\frac{n}{d}\rfloor}k^2\mu(k)\sum_{i=1}^{\lfloor\frac{n}{kd}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{kd}\rfloor}ij\\ &\ \ \ \ \ \ \ \ \ \ \ \ \ 令\ t=kd,则\\ 原式&=\sum_{t=1}^n\sum_{d|t}d^3\mu(\frac{t}{d})(\frac{t}{d})^2\sum_{i=1}^{\lfloor\frac{n}{t}\rfloor}i\sum_{j=1}^{\lfloor\frac{n}{t}\rfloor}j\\ &=\sum_{t=1}^nt^2\varphi(t)\left(\frac{\lfloor\frac{n}{t}\rfloor(\lfloor\frac{n}{t}\rfloor+1)}{2}\right)^2 \end{aligned}

欧拉反演

欧拉反演相较于莫反而言,省去了大量的推导步骤,更加直接,但同样可以由莫反推出。

欧拉反演还是一句话:

n=\sum_{d|n}\varphi(d)

同样,只有这一句话同样也是屁用没有,接下来还是拿真题练练手。

例题 1 GCD SUM

\begin{aligned} &\ \ \ \ \ \sum_{i=1}^n\sum_{j=1}^n\gcd(i,j)\\ &=\sum_{i=1}^n\sum_{j=1}^n\sum_{d|i,d|j}\varphi(d)\\ &=\sum_{d=1}^n\varphi(d)\sum_{d|i,i\le n}\sum_{d|j,j\le n}1\\ &=\sum_{d=1}^n\varphi(d)\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}1\\ &=\sum_{d=1}^n\varphi(d)\lfloor\frac{n}{d}\rfloor^2 \end{aligned}

怎么样,是不是感觉比莫反简单多了?

例题 2 简单的数学题

\begin{aligned} &\ \ \ \ \ \sum_{i=1}^n\sum_{j=1}^nij\gcd(i,j)\\ &=\sum_{i=1}^n\sum_{j=1}^nij\sum_{d|i,d|j}\varphi(d)\\ &=\sum_{d=1}^n\varphi(d)\sum_{d|i,i\le n}\sum_{d|j,j\le n}ij\\ &=\sum_{d=1}^nd^2\varphi(d)\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}i\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}j\\ &=\sum_{d=1}^nd^2\varphi(d)\left(\frac{\lfloor\frac{n}{d}\rfloor(\lfloor\frac{n}{d}\rfloor+1)}{2}\right)^2 \end{aligned}

后记

感谢 @Iniaugoty,@Rain_chr 与 @MarsCheng 三位大佬的指点,使我彻底学会了莫反。希望看到这里的各位能给他们三位关注,同时我也在这里无耻求关求赞。