当前位置 博文首页 > forever_shi的博客:莫比乌斯反演 狄利克雷卷积 杜教筛 学习笔记
非常抱歉,这篇文章之前出锅了,如果对您产生了误导,在此向您道歉!
前置知识:一些数论函数,比如欧拉函数、莫比乌斯函数的一些性质,积性函数及性质,整除分块。
这里默认大家会前置知识,如果不会请自行学习。
之前尝试看过,结果后来都忘光了,于是还是决定应该写个学习笔记记录一下。
首先开始介绍莫比乌斯反演。
我们设
f
(
d
)
f(d)
f(d)和
F
(
n
)
F(n)
F(n)为定义在非负整数集合上的两个函数,并且满足下列条件:
F
(
n
)
=
∑
d
∣
n
f
(
d
)
F(n)=\sum_{d|n}f(d)
F(n)=∑d∣n?f(d)。那么根据莫比乌斯反演,有
f
(
n
)
=
∑
d
∣
n
μ
(
d
)
F
(
?
n
d
?
)
f(n)=\sum_{d|n}\mu(d)F(\lfloor\frac{n}{d}\rfloor)
f(n)=d∣n∑?μ(d)F(?dn??)
证明一会儿讲狄利克雷卷积之后再证。
当然,如果是 F ( n ) = ∑ n ∣ d f ( d ) F(n)=\sum_{n|d}f(d) F(n)=∑n∣d?f(d),那么我们有 f ( n ) = ∑ n ∣ d μ ( ? d n ? ) F ( d ) f(n)=\sum_{n|d}\mu(\lfloor\frac{d}{n}\rfloor)F(d) f(n)=n∣d∑?μ(?nd??)F(d)
莫比乌斯反演经常用来解决这样一类问题:我们要求 f ( n ) f(n) f(n),但是 f ( n ) f(n) f(n)并不好求,但是我们可以找到一个函数 F ( n ) F(n) F(n),满足 F ( n ) = ∑ d ∣ n f ( d ) F(n)=\sum_{d|n}f(d) F(n)=∑d∣n?f(d)或者 F ( n ) = ∑ n ∣ d f ( d ) F(n)=\sum_{n|d}f(d) F(n)=∑n∣d?f(d),并且 F ( n ) F(n) F(n)比较容易求出来,那么我们就可以求出 F ( n ) F(n) F(n),然后利用反演求出 f ( n ) f(n) f(n)。具体的代码实现时通常是用到整除分块来做到 O ( n ) O(\sqrt{n}) O(n?)来算出结果。
这里要用到一些复杂度优秀的筛法来预处理一些积性函数的前缀和,通常是
μ
\mu
μ函数。比较简单地,我们可以用线性筛求出
μ
\mu
μ函数等积性函数,然后
O
(
n
)
O(n)
O(n)求前缀和。
但是我们会发现有些题目是需要复杂度更优秀的筛法的。我暂时还不会洲阁筛和min_25筛,于是在这里介绍一下杜教筛。
杜教筛是一种利用狄利克雷卷积来求前缀和的算法,所以在介绍杜教筛之前我先来介绍一下狄利克雷卷积。
先介绍几种函数,以下函数都是积性函数。
d
(
n
)
d(n)
d(n):表示
n
n
n的约数个数。
d
(
n
)
=
∑
d
=
1
n
[
d
∣
n
]
d(n)=\sum_{d=1}^n[d|n]
d(n)=∑d=1n?[d∣n],
[
?
]
[\ ]
[?]应该是表示内部如果是true的话就是1,否则就是0的样子。
e
(
n
)
e(n)
e(n):
e
(
n
)
=
[
n
=
1
]
e(n)=[n=1]
e(n)=[n=1]
1
(
n
)
1(n)
1(n):恒等函数,值始终是1
i
d
(
n
)
id(n)
id(n