莫比乌斯反演(函数)水题目害写
成功在考试中垫底了,突然发现自己不会莫反学过但忘光了,看来有必要记录一下,于是重新复习了一下,写了几道水题。
主要怕以后有忘了。。。
其实都是板子题,但是我太菜了,啥也不会。。。
所谓莫反
懵逼?钨丝?反演?
反演,即已知如何用 \(f\) 求出 \(g\) , 然后推倒如何用 \(g\) 求出 \(f\) 。
莫比乌斯反演,指利用莫比乌斯函数进行反演(貌似是废话。。。
证明略
好了,这就是莫反的全部内容了,来看例题吧
稍加解释一下吧。。。
对于类似这样的式子:
若我们想求 \(g\) ,但是 \(g\) 不好求而 \(f\) 好求,将上述式子写成卷积的形式:
两边同时卷一个 \(\mu\) :
即:
于是有:
实际在应用上,可以构造一个好看的函数辅助求值,但是我这么菜显然不会,因此我一般都是将式子中的 \(\epsilon\) 替换成 \(\mu * 1\) ,这样便将问题从一个判定性问题转换成直接求的问题 。
一点自己的理解:实际上就是将每个数看做一个可重集,每个质因子都是一个元素,\(\mu\) 便可看做是容斥系数。
简单例题
就放一道板子题吧。。。
本来是洛谷上一道题,但是因为我看错题了,写完式子才发现。。。所以就把链接删掉了。。。
题目大意:
不难发现可以将式子分成四个部分求解,因此只需要求 \(\sum_{i = 1}^n \sum_{j = 1}^m (i, j)\) 即可,默认\(n \le m\)。
按照套枚举 \(gcd\) :
按照套路优先枚举 \(t\) :
按照套路令 \(T = td\) ,然后优先枚举 \(T\) :
令 \(F(n) = \sum_{d | n} \frac{n}{d} \mu_d\) ,可以在 \(O(n \log n)\) 时间复杂度内预处理,则:
不难发现式子的后半部分可以整除分块,于是求出 \(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
题目大意:
小学奥数告诉我们 \(lcm(i, j) = \frac{ij}{gcd(i, j)}\) :
按照套路将 \(gcd\) 提前:
发现后面这一部分和刚才板子题的式子很像,于是按照套路把刚才的式子抄过来:
令 \(sum(n, m) = \sum_{i = 1}^n \sum_{j = 1}^m ij\),不难发现这个式子可以 \(O(1)\) 求解:
不难发现这个式子前半部分可以数论分块,后半部分也可以,总时间复杂度为 \(O(n + m)\) 。
但是此题还可以继续扩展。
按照刚才的套路将令 \(T = td\) ,然后优先枚举 \(T\):
令 \(F(n) = \sum_{d | T} \mu(d) d\) ,不难发现这是一个积性函数,可以线性筛预处理,于是原式变为:
于是我们就可以一次 \(O(n)\) 预处理,然后 \(O(\sqrt{n})\) 解决多组询问,总时间复杂度为 \(O(n + T \sqrt{n})\) 。
这题貌似也有点板。。。
P3768 简单的数学题 与此题相似,但需要杜教筛,在此不加以赘述。一会再赘述。。
P6156 简单题 是一道好题,然而我不会其中某公式的证明,先咕了。。。
P6222 「P6156 简单题」加强版 同上。。
P5221 Product
题目大意 :
乍一看和上一题很像,但是求和变成了求积。
同上一题,由小学奥数可知 \(lcm(i, j) = \frac{ij}{gcd(i, j)}\) ,于是原式可写成:
考虑分别求出 \(\prod_{i = 1}^n \prod_{j = 1}^n ij\) 和 \(\prod_{i = 1}^n \prod_{j = 1}^n gcd(i, j)\) ,前式显然可以 \(O(n)\) 求解,因此重点看后式。
按照套路提前 \(gcd\) 。
发现指数是非常熟悉的样子,显然可以来一发莫反:
再按照刚才的套路,令\(T = td\) ,于是原式可变为:
至此,可以 \(O(n \log n)\) 预处理,\(O(\sqrt{n})\) 求解,然而这么写会被凉心出题人卡内存。。。
回到莫反之前:
观察指数式子,不难联想到仪仗队一题,由 \(\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 = 1}^n lcm(A_i, A_j)\) 即可。
然而还是不好求,考虑转移到值域上,令 \(a_i = \sum_{j = 1}^n [A_j = i]\) ,记 \(max = max_{i = 1}^n A_i\) 。
此时问题变成了:
怠惰了,懒得推了。。。
累了,毁灭吧。。。
式子前半部分显然可以直接大力枚举,后半部分也可以大力枚举当然如果您精通卷积,也可以用高维前缀和 ,于是此题得解。
CF1139D Steps to One
好题,感觉很巧妙,不知道为啥评分这么低。。。可能太套路了??
首先有一个十分 \(naive\) 的想法,设 \(f(i)\) 表示当前序列 \(gcd\) 为 \(i\) 时,期望还能在后面放几个数。
则最终答案为 \(ans = 1 + \frac{\sum_{i = 1}^m f(i)}{m}\) 。
考虑如何求 \(f\) 。
\(f(1) = 0\) 显然。
不难列出状态转移:
然后发现这个式子里有 \(gcd\) ,不难想到莫比乌斯反演,然后暴力转移即可。。。
怠惰啊怠惰,实在是罪过,我明明已经想到了一个特别赞的推导方法,奈何地方太小写不下了。
其它
P3768 简单的数学题
刚刚咕掉的这道题,有一种极为巧妙的方法貌似叫欧拉反演还是什么,反正我没听说过。。。
这道题可以用莫比乌斯反演做,但是正如上面那些题一样,推导过程及其繁琐,现在我已经头晕目眩,看到 \(gcd\) 便想吐了,因此记录一种小清新方法。
题目大意:
首先有这样一个式子:
证明在 oi-wiki 上,很详细,在此不加以赘述。
这个式子代表着,我们可以用 \(\varphi\) 表示任何数,所以在式子中看到什么不顺眼用 \(\varphi\) 替代它就好了。
看到上面式子中,显然 \(gcd(i, j)\) 最不好看,于是用 \(\varphi\) 替代之:
不难发现后半部分可以整除分块,然而 \(n \le 10^{10}\) 不能直接预处理 \(\varphi(d) d^2\) ,因此用杜教筛即可。
\(\varphi(d) d^2\) 卷一个 \(id^2\) 便可以杜教筛。