总所周知,杜教筛是一个可以快速求积性函数前缀和的工具,为了快速理解杜教筛,自己给自己写了一个文章快速理解。
它可以在O(n2/3)的复杂度快速求出某个积性函数的前缀和。
例如,我们想要知道 f f f函数的前缀和,我们可以去找一个 g g g函数,可以O(1)求出前缀和的两个函数 g g g函数, f ∗ g f*g f∗g函数。
f
∗
g
f*g
f∗g函数中间的乘号代表迪利克雷卷积。
常见的迪利克雷卷积有
μ
∗
I
=
ϵ
μ * I = ϵ
μ∗I=ϵ
φ
∗
I
=
I
d
φ * I = Id
φ∗I=Id
I
d
∗
μ
=
φ
Id * μ = φ
Id∗μ=φ
μ
μ
μ、
ϵ
ϵ
ϵ、
φ
φ
φ分别代表莫比乌斯函数,单位元,欧拉函数。
I
d
Id
Id、
I
I
I分别表示
I
d
(
n
)
=
n
Id(n) = n
Id(n)=n,
I
(
n
)
=
[
n
=
=
1
]
I(n) = [n == 1]
I(n)=[n==1]
杜教筛的核心是什么呢?
由于
f
∗
g
f*g
f∗g函数是可以O(1)求出来的。
我们考虑对其分解
然后就得到了一个核心式子:
g
(
1
)
∗
s
u
m
(
n
)
=
∑
(
f
∗
g
)
(
n
)
−
∑
g
(
i
)
∗
s
u
m
(
n
/
i
)
g(1) * sum(n) = ∑(f * g)(n) - ∑g(i) * sum(n/i)
g(1)∗sum(n)=∑(f∗g)(n)−∑g(i)∗sum(n/i)
我们发现后面有 n / i n/i n/i考虑对其数论分块即可。