莫比乌斯反演(函数)水题目害写

成功在考试中垫底了,突然发现自己不会莫反学过但忘光了,看来有必要记录一下,于是重新复习了一下,写了几道水题。
主要怕以后有忘了。。。

其实都是板子题,但是我太菜了,啥也不会。。。

所谓莫反

懵逼?钨丝?反演?

反演,即已知如何用 \(f\) 求出 \(g\) , 然后推倒如何用 \(g\) 求出 \(f\)

莫比乌斯反演,指利用莫比乌斯函数进行反演(貌似是废话。。。

\[\mu * 1 = \epsilon \]

证明略
好了,这就是莫反的全部内容了,来看例题吧

稍加解释一下吧。。。

对于类似这样的式子:

\[f_n = \sum_{d | n} g_d \]

若我们想求 \(g\) ,但是 \(g\) 不好求而 \(f\) 好求,将上述式子写成卷积的形式:

\[f = g * 1 \]

两边同时卷一个 \(\mu\)

\[f * \mu = g * \epsilon \]

即:

\[g = f * \mu \]

于是有:

\[f_n = \sum_{d | n} g_d \Longleftrightarrow g_n = \sum_{d | n} \mu_d f_{\frac{n}{d}} \]

实际在应用上,可以构造一个好看的函数辅助求值,但是我这么菜显然不会,因此我一般都是将式子中的 \(\epsilon\) 替换成 \(\mu * 1\) ,这样便将问题从一个判定性问题转换成直接求的问题 。

一点自己的理解:实际上就是将每个数看做一个可重集,每个质因子都是一个元素,\(\mu\) 便可看做是容斥系数。

简单例题

就放一道板子题吧。。。

本来是洛谷上一道题,但是因为我看错题了,写完式子才发现。。。所以就把链接删掉了。。。

题目大意:

\[\sum_{i = a}^b \sum_{j = c}^d (i, j) \]

不难发现可以将式子分成四个部分求解,因此只需要求 \(\sum_{i = 1}^n \sum_{j = 1}^m (i, j)\) 即可,默认\(n \le m\)

按照套枚举 \(gcd\)

\[\sum_{d=1}^n d \sum_{i = 1}^n \sum_{j = 1}^m [(i, j) = d] \]

\[= \sum_{d=1}^n d \sum_{i = 1}^{\frac{n}{d}} \sum_{j = 1}^{\frac{m}{d}} [(i, j) = 1] \]

\[= \sum_{d=1}^n d \sum_{i = 1}^{\frac{n}{d}} \sum_{j = 1}^{\frac{m}{d}} \sum_{t | (i, j)} \mu(t) \]

按照套路优先枚举 \(t\)

\[= \sum_{d = 1}^n d \sum_{t = 1}^{\frac{n}{d}} \mu(t) \sum_{t | i} \sum_{t | j} 1 \]

\[= \sum_{d = 1}^n d \sum_{t = 1}^{\frac{n}{d}} \mu(t) \lfloor \frac{n}{td} \rfloor \lfloor \frac{m}{td} \rfloor \]

按照套路令 \(T = td\) ,然后优先枚举 \(T\) :

\[= \sum_{T = 1}^n \lfloor \frac{n}{T} \rfloor \lfloor \frac{m}{T} \rfloor \sum_{d | T} \frac{T}{d} \mu(d) \]

\(F(n) = \sum_{d | n} \frac{n}{d} \mu_d\) ,可以在 \(O(n \log n)\) 时间复杂度内预处理,则:

\[ans = \sum_{T = 1}^n F(T) \lfloor \frac{n}{T} \rfloor \lfloor \frac{m}{T} \rfloor \]

不难发现式子的后半部分可以整除分块,于是求出 \(F\) 的前缀和,每次询问 \(O(\sqrt{n})\) 求解,总时间复杂度\(O(n \log n + T \sqrt{n}) = O(能过)\)

这道题把莫反大部分基础套路都用了一遍。

一些大同小异的板子。。。
P3455 [POI2007]ZAP-Queries
P2257 YY的GCD
P2522 [HAOI2011]Problem b

稍难的例题

P1829 [国家集训队]Crash的数字表格 / JZPTAB

题目大意:

\[\sum_{i = 1}^n \sum_{j = 1}^n lcm(i, j) \]

小学奥数告诉我们 \(lcm(i, j) = \frac{ij}{gcd(i, j)}\)

\[\sum_{i = 1}^n \sum_{j = 1}^n lcm(i, j) \]

\[= \sum_{i = 1}^n \sum_{j = 1}^n \frac{ij}{gcd(i, j)} \]

按照套路将 \(gcd\) 提前:

\[= \sum_{d = 1}^n d^{-1} \sum_{i = 1}^n \sum_{j = 1}^m ij [(i, j) = d] \]

发现后面这一部分和刚才板子题的式子很像,于是按照套路把刚才的式子抄过来:

\[= \sum_{d = 1}^n d \sum_{t = 1}^{\frac{n}{d}} \mu(t) \sum_{t | i} \sum_{t | j} ij \]

\[= \sum_{d = 1}^n d \sum_{t = 1}^{\frac{n}{d}} \mu(t) t^2 \sum_{i = 1}^{\lfloor \frac{n}{td} \rfloor} \sum_{j = 1}^{\lfloor \frac{m}{td} \rfloor} ij \]

\(sum(n, m) = \sum_{i = 1}^n \sum_{j = 1}^m ij\),不难发现这个式子可以 \(O(1)\) 求解:

\[= \sum_{d = 1}^n d \sum_{t = 1}^{\frac{n}{d}} \mu(t) t^2 sum(\lfloor \frac{n}{td} \rfloor, \lfloor \frac{m}{td} \rfloor) \]

不难发现这个式子前半部分可以数论分块,后半部分也可以,总时间复杂度为 \(O(n + m)\)

但是此题还可以继续扩展。

按照刚才的套路将令 \(T = td\) ,然后优先枚举 \(T\)

\[= \sum_{T = 1}^n T sum(\lfloor \frac{n}{T} \rfloor, \lfloor \frac{m}{T} \rfloor) \sum_{d | T} \mu(d) d \]

\(F(n) = \sum_{d | T} \mu(d) d\) ,不难发现这是一个积性函数,可以线性筛预处理,于是原式变为:

\[ans = \sum_{T = 1}^n T sum(\lfloor \frac{n}{T} \rfloor, \lfloor \frac{m}{T} \rfloor) F(T) \]

于是我们就可以一次 \(O(n)\) 预处理,然后 \(O(\sqrt{n})\) 解决多组询问,总时间复杂度为 \(O(n + T \sqrt{n})\)

这题貌似也有点板。。。
P3768 简单的数学题 与此题相似,但需要杜教筛,在此不加以赘述。一会再赘述。。
P6156 简单题 是一道好题,然而我不会其中某公式的证明,先咕了。。。
P6222 「P6156 简单题」加强版 同上。。

P5221 Product

题目大意 :

\[\prod_{i = 1}^n \prod_{j = 1}^n \frac{lcm(i, j)}{gcd(i,j)} \]

乍一看和上一题很像,但是求和变成了求积。

同上一题,由小学奥数可知 \(lcm(i, j) = \frac{ij}{gcd(i, j)}\) ,于是原式可写成:

\[\prod_{i = 1}^n \prod_{j = 1}^n \frac{ij}{gcd^2(i, j)} \]

考虑分别求出 \(\prod_{i = 1}^n \prod_{j = 1}^n ij\)\(\prod_{i = 1}^n \prod_{j = 1}^n gcd(i, j)\) ,前式显然可以 \(O(n)\) 求解,因此重点看后式。

\[\prod_{i = 1}^n \prod_{j = 1}^n gcd(i, j) \]

按照套路提前 \(gcd\)

\[= \prod_{d = 1}^n d^{\sum_{i = 1}^n \sum_{j = 1}^n [gcd(i, j) = d]} \]

发现指数是非常熟悉的样子,显然可以来一发莫反:

\[\sum_{i = 1}^n \sum_{j = 1}^n [gcd(i, j) = d] \]

\[= \sum_{t = 1}^{\frac{n}{d}} \mu(t) (\lfloor \frac{n}{td} \rfloor)^2 \]

再按照刚才的套路,令\(T = td\) ,于是原式可变为:

\[= \prod_{T = 1}^n (\prod_{d | T} d^{\mu(T / d)})^{(\lfloor \frac{n}{T} \rfloor)^2} \]

至此,可以 \(O(n \log n)\) 预处理,\(O(\sqrt{n})\) 求解,然而这么写会被凉心出题人卡内存。。。

回到莫反之前:

\[\prod_{d = 1}^n d^{\sum_{i = 1}^{\lfloor \frac{n}{d} \rfloor} \sum_{j = 1}^{\lfloor \frac{n}{d} \rfloor} [gcd(i, j) = 1]} \]

观察指数式子,不难联想到仪仗队一题,由 \(\varphi(n) = \sum_{i = 1}^n [gcd(i, n)] = 1\),可将指数化为 \(\varphi^2(\lfloor \frac{n}{d} \rfloor) - 1\),于是只需要线性筛出 \(\varphi\) 即可,着实是一种不错的思路。

P3312 [SDOI2014]数表
P3704 [SDOI2017]数字表格
P3327 [SDOI2015]约数个数和
一些比较套路的题,当做练习吧,懒就不写题解了。。。
其实数表不是很套路,是特别套路。。。

扩展

上面瞎写了一堆,然而考试的时候很少直接考莫比乌斯反演,但是时常用莫比乌斯函数进行容斥。

[AGC038C] LCMs

众所周知 \(AGC\) 一般都是神仙题。。。
题目大意:

\[\sum_{i = 1}^n \sum_{j = i + 1}^n lcm(A_i, A_j) \]

首先有一个显然的转化:

\[\sum_{i = 1}^n \sum_{j = i + 1}^n lcm(A_i, A_j) = \frac{\sum_{i = 1}^n \sum_{j = 1}^n lcm(A_i, A_j) - \sum{i = 1}^n A_i}{2} \]

因此只要求 \(\sum_{i = 1}^n \sum_{j = 1}^n lcm(A_i, A_j)\) 即可。
然而还是不好求,考虑转移到值域上,令 \(a_i = \sum_{j = 1}^n [A_j = i]\) ,记 \(max = max_{i = 1}^n A_i\)
此时问题变成了:

\[\sum_{i = 1}^{max} \sum_{j = 1}^{max} a_i a_j lcm(i, j) \]

怠惰了,懒得推了。。。
累了,毁灭吧。。。

\[= \sum_{d = 1}^{max} d^{-1} \sum_{t = 1}^{\lfloor \frac{max}{d} \rfloor} \mu(t) (\sum_{dt | i} i a_i) ^2 \]

式子前半部分显然可以直接大力枚举,后半部分也可以大力枚举当然如果您精通卷积,也可以用高维前缀和 ,于是此题得解。

CF1139D Steps to One

好题,感觉很巧妙,不知道为啥评分这么低。。。可能太套路了??

首先有一个十分 \(naive\) 的想法,设 \(f(i)\) 表示当前序列 \(gcd\)\(i\) 时,期望还能在后面放几个数。
则最终答案为 \(ans = 1 + \frac{\sum_{i = 1}^m f(i)}{m}\)

考虑如何求 \(f\)
\(f(1) = 0\) 显然。
不难列出状态转移:

\[f(i) = 1 + \frac{\sum_{j = 1}^m f(gcd(i, j))}{m} \]

然后发现这个式子里有 \(gcd\) ,不难想到莫比乌斯反演,然后暴力转移即可。。。

怠惰啊怠惰,实在是罪过,我明明已经想到了一个特别赞的推导方法,奈何地方太小写不下了。

其它

P3768 简单的数学题

刚刚咕掉的这道题,有一种极为巧妙的方法貌似叫欧拉反演还是什么,反正我没听说过。。。

这道题可以用莫比乌斯反演做,但是正如上面那些题一样,推导过程及其繁琐,现在我已经头晕目眩,看到 \(gcd\) 便想吐了,因此记录一种小清新方法。

题目大意:

\[\sum_{i = 1}^n \sum_{j = 1}^n ij gcd(i, j) \]

首先有这样一个式子:

\[\varphi * 1 = id \]

证明在 oi-wiki 上,很详细,在此不加以赘述。
这个式子代表着,我们可以用 \(\varphi\) 表示任何数,所以在式子中看到什么不顺眼用 \(\varphi\) 替代它就好了。

看到上面式子中,显然 \(gcd(i, j)\) 最不好看,于是用 \(\varphi\) 替代之:

\[\sum_{i = 1}^n \sum_{j = 1}^n ij (i, j) \]

\[= \sum_{i = 1}^n \sum_{j = 1}^n ij \sum_{d | (i, j)} \varphi (d) \]

\[= \sum_{d = 1}^n \varphi(d) \sum_{d | i}^n \sum_{d | j}^n ij \]

\[= \sum_{d = 1}^n \varphi(d) d^2 (\sum_{i = 1}^{\lfloor \frac{n}{d} \rfloor} i)^2 \]

不难发现后半部分可以整除分块,然而 \(n \le 10^{10}\) 不能直接预处理 \(\varphi(d) d^2\) ,因此用杜教筛即可。
\(\varphi(d) d^2\) 卷一个 \(id^2\) 便可以杜教筛。

posted @ 2022-01-05 15:59  Cyber_Tree  阅读(129)  评论(0编辑  收藏  举报