莫比乌斯反演学习笔记

前段时间学习了莫比乌斯反演,现在补一篇学习笔记吧。


Step 1:莫比乌斯函数

首先我们来定义一下莫比乌斯函数 μ ,它的取值如下:

μ(n)={1n=1(1)kn=p1p2pk0otherwise

显然,莫比乌斯函数是一个积性函数,所以我们可以用线性筛将他筛出来。

莫比乌斯函数具有很好的容斥性,在一部分题目中会用得到。


Step 2:狄利克雷卷积

话分一头,我们来先学习一下另一个鬼东西:狄利克雷卷积。

引用一下我的另一个blog

Step 3: 莫比乌斯反演

写了这么久终于要开始正式讲解了。

我们定义两个函数 f,F。其中:

F(n)=d|nf(d)

然后我们要去推这么一个柿子:

f(n)=d|nF(d)μ(nd)

我们先列出几项:

F(1)=f(1)

F(2)=f(1)+f(2)

F(3)=f(1)+f(3)

F(4)=f(1)+f(2)+f(4)

可以得出:

f(1)=F(1)

f(2)=F(2)F(1)

f(3)=F(3)F(1)

f(4)=F(4)F(2)

emmm,好像看不出来什么

接下来我们就要用狄利克雷卷积来证明他。

首先,很明显的是

F=fI

两边同时卷上个 μ:

Fμ=fIμ

然后我们知道

Iμ=ε

Fμ=fε

Fμ=f

证毕。

同样,我们也可证出莫比乌斯反演的另一种形式:

F(n)=n|df(d)

f(n)=n|dμ(dn)F(d)

后者更加常用(虽然一般做题都不会生搬硬套上面两个形式)。


我们来举个例子使用莫比乌斯反演来做一做:
给定一个数 n,求以下式子的值:

i=1nj=1ngcd(i,j)A

1n105

first:

暴力枚举,时间 O(n2logn)

second:

接下来就是用莫比乌斯反演推柿子的时间了。

i=1nj=1ngcd(i,j)

我们改变枚举顺序,先枚举 gcd(i,j)

=d=1ndi=1nj=1n[gcd(i,j)==d]

我们把 i,j 的枚举范围稍加改变,只枚举 d 的倍数。

=d=1ndi=1[nd]j=1[nd][gcd(i,j)==1]

接下来就是见证奇迹的时刻:

=d=1ndi=1[nd]j=1[nd]k|gcd(i,j)μ(k)

这是为什么呢?因为 μ1=ε,所以柿子值是不变的。

我们再次改变枚举顺序,先枚举 k

=d=1ndk=1[nd]μ(k)i=1[nd]j=1[nd]1

经过我们的一通瞎操作这个柿子终于变得毒瘤起来了。

我们发现最后的两个 其实是不必要的,我们可以把它变成[nd]2
式子变成了这样:

=d=1ndk=1[nd]μ(k)[nd]2B

这个柿子呢我们来分析一下它的复杂度,应该为:

i=1n[ni]

这个东西我们把它称为调和级数,计算出来约是等于 O(nlnn)


其实这个柿子还可以优化,以下有两种优化方法:

1.数论分块:

引理:对于正整数 n, S={x|x=[ni],iN}|S|n同阶

这个引理本人太菜了不会证明,先放个坑以后填上,但结论是正确的。

那么上面这个 B 式我们就可以将所有 [ni] 相等的数统一计算可以达到 O(n) 的优秀复杂度。

2.继续将柿子优化:

我们可以设 T=dk,然后柿子就变成了这样:

T=1nd|Tdμ(Td)[nd]2

其中我们发现 d|Tdμ(Td)可以用一种类似埃式筛的方法预处理,时间复杂度为 O(nlnn),然后 O(n) 的速度输出答案

第一种方法适合单次输出答案,第二种方法适合多测,一般使用第二种方法。

posted @   LUlululu1616  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示