杜教筛
杜教筛用于计算函数的前缀和。
若需要计算前缀和的函数为 f f f,前缀和函数为 S S S,那么有 S ( n ) = ∑ i = 1 n f ( i ) S(n)=\sum_{i=1}^{n}f(i) S(n)=∑i=1nf(i)。现在通过构造一个合适的函数 g g g,优化其计算过程。
对于任意和两个函数
f
,
g
f,g
f,g,以下均成立:
∑
i
=
1
n
∑
d
∣
i
g
(
d
)
f
(
i
d
)
=
∑
i
=
1
n
g
(
i
)
∑
i
=
1
⌊
n
i
⌋
f
(
i
)
=
∑
i
=
1
n
g
(
i
)
S
(
⌊
n
i
⌋
)
g
(
1
)
S
(
n
)
=
∑
i
=
1
n
(
g
∗
f
)
(
i
)
−
∑
i
=
2
n
g
(
i
)
S
(
⌊
n
i
⌋
)
\sum_{i=1}^{n}\sum_{d|i}g(d)f(\frac{i}{d})=\sum_{i=1}^{n}g(i)\sum_{i=1}^{\lfloor \frac{n}{i} \rfloor} f(i)=\sum_{i=1}^{n}g(i)S(\lfloor \frac{n}{i} \rfloor) \\ g(1)S(n)=\sum_{i=1}^{n}(g*f)(i)-\sum_{i=2}^{n}g(i)S(\lfloor \frac{n}{i} \rfloor)
i=1∑nd∣i∑g(d)f(di)=i=1∑ng(i)i=1∑⌊in⌋f(i)=i=1∑ng(i)S(⌊in⌋)g(1)S(n)=i=1∑n(g∗f)(i)−i=2∑ng(i)S(⌊in⌋)
可以发现等式右边减法部分,关于
S
(
⌊
n
i
⌋
)
S(\lfloor \frac{n}{i} \rfloor)
S(⌊in⌋)的部分是数论分块的形式,如果函数
g
g
g能够快速的计算一段的和(前缀和),那么后半部分就可以用数论分块的形式解决。同时,前半部分在迪利克雷卷积之后得到的函数如果能快速计算前缀和,那么这个转移就可以快速计算了。
分析一下可以发现,由于 S ( x ) S(x) S(x)中 x x x的的取值全部都可以表示成 ⌊ n x ′ ⌋ \lfloor \frac{n}{x'} \rfloor ⌊x′n⌋的形式,所以只会有 n \sqrt n n种取值。
并且在杜教筛之前可以预处理一部分前缀和,这样可以跑的更快。
提要
要构造一个函数 g g g,满足如下条件:
- 与求前缀和的函数 f f f,迪利克雷卷积之后方便计算
- 本身方便计算