一、引入
通常,在莫比乌斯反演的题目中会推出下面这样的式子:
∑
i
=
1
n
⌊
n
i
⌋
f
(
i
)
\sum_{i=1}^n\lfloor\frac ni\rfloor f(i)
i=1∑n⌊in⌋f(i)
其中
f
f
f 是积性函数。
我们知道,当
1
≤
i
≤
n
1\le i\le n
1≤i≤n 时
⌊
n
i
⌋
\lfloor\frac ni\rfloor
⌊in⌋ 的取值只有
O
(
n
)
O(\sqrt n)
O(n) 种。
于是我们可以对下界分块,利用
f
f
f 的前缀和求解,从而实现一次
O
(
n
)
O(\sqrt n)
O(n) 的复杂度。
但如果
n
=
1
0
9
n=10^9
n=109 时,如何求
f
f
f 的前缀和呢?
下面就来介绍求积性函数前缀和的算法:杜教筛。
二、前置芝士:狄利克雷 (Dirichlet) 卷积
两个数论函数函数
f
f
f 和
g
g
g 的狄利克雷卷积定义为:
(
f
∗
g
)
(
n
)
∑
d
∣
n
f
(
d
)
g
(
n
d
)
(f*g)(n)\sum_{d|n}f(d)g(\frac nd)
(f∗g)(n)d∣n∑f(d)g(dn)
如果
f
f
f 和
g
g
g 为积性函数,那么
f
∗
g
f*g
f∗g 也是积性函数。
三、算法流程
设我们要求的值:
S
(
n
)
=
∑
i
=
1
n
f
(
i
)
S(n)=\sum_{i=1}^nf(i)
S(n)=i=1∑nf(i)
首先找到一个积性函数
g
g
g ,使得
h
(
n
)
=
∑
i
=
1
n
(
f
∗
g
)
(
i
)
h(n)=\sum_{i=1}^n(f*g)(i)
h(n)=i=1∑n(f∗g)(i)
可以被
O
(
1
)
O(1)
O(1) 计算出,
g
(
n
)
g(n)
g(n) 的值及前缀和也能被
O
(
1
)
O(1)
O(1) 计算出。
于是有:
∑
i
=
1
n
∑
d
∣
i
f
(
i
d
)
g
(
d
)
=
h
(
n
)
\sum_{i=1}^n\sum_{d|i}f(\frac id)g(d)=h(n)
i=1∑nd∣i∑f(di)g(d)=h(n)
把枚举约数改成枚举倍数:
∑
d
=
1
n
g
(
d
)
∑
1
≤
i
≤
n
,
d
∣
i
f
(
i
d
)
=
h
(
n
)
\sum_{d=1}^ng(d)\sum_{1\le i\le n,d|i}f(\frac id)=h(n)
d=1∑ng(d)1≤i≤n,d∣i∑f(di)=h(n)
满足所有
1
≤
i
≤
n
,
d
∣
i
1\le i\le n,d|i
1≤i≤n,d∣i 的
i
d
\frac id
di 实际上就是所有满足
1
≤
i
≤
⌊
n
d
⌋
1\le i\le\lfloor\frac nd\rfloor
1≤i≤⌊dn⌋ 的
i
i
i :
∑
i
=
1
n
g
(
i
)
∑
j
=
1
⌊
n
i
⌋
f
(
j
)
=
h
(
n
)
\sum_{i=1}^ng(i)\sum_{j=1}^{\lfloor\frac ni\rfloor}f(j)=h(n)
i=1∑ng(i)j=1∑⌊in⌋f(j)=h(n)
于是:
∑
i
=
1
n
g
(
i
)
S
(
⌊
n
i
⌋
)
=
h
(
n
)
\sum_{i=1}^ng(i)S(\lfloor\frac ni\rfloor)=h(n)
i=1∑ng(i)S(⌊in⌋)=h(n)
由于
⌊
n
1
⌋
=
n
\lfloor\frac n1\rfloor=n
⌊1n⌋=n ,故:
g
(
1
)
S
(
n
)
=
h
(
n
)
−
∑
i
=
2
n
g
(
i
)
S
(
⌊
n
i
⌋
)
g(1)S(n)=h(n)-\sum_{i=2}^ng(i)S(\lfloor\frac ni\rfloor)
g(1)S(n)=h(n)−i=2∑ng(i)S(⌊in⌋)
对
⌊
n
i
⌋
\lfloor\frac ni\rfloor
⌊in⌋ 下界分块。使用记忆化搜索就能在
O
(
n
3
4
)
O(n^{\frac 34})
O(n43) 内求出一个前缀和。
为了提高效率,我们还需要结合线性筛,筛出
n
2
3
n^{\frac 23}
n32 内的所有
S
S
S 值。
这样,我们实现了
O
(
n
2
3
)
O(n^{\frac 23})
O(n32) 求
S
(
n
)
S(n)
S(n) 。
四、复杂度分析
求
S
(
n
)
S(n)
S(n) 时由于使用了记忆化,所以会递归到的值
x
x
x 一定是
⌊
n
i
⌋
\lfloor\frac ni\rfloor
⌊in⌋ 的取值(最多
O
(
n
)
O(\sqrt n)
O(n) 种)。
所以复杂度(不结合线性筛的情况下):
∑
i
=
1
n
i
+
∑
i
=
1
n
n
i
\sum_{i=1}^{\sqrt n}\sqrt i+\sum_{i=1}^{\sqrt n}\sqrt{\frac ni}
i=1∑ni+i=1∑nin
=
∫
0
n
(
x
+
n
x
)
d
x
=
O
(
n
3
4
)
=\int_0^{\sqrt n}(\sqrt x+\sqrt{\frac nx})\text{d}x=O(n^{\frac 34})
=∫0n(x+xn)dx=O(n43)
如果结合了线性筛,那么能递归到的
x
x
x 至少
n
2
3
n^{\frac 23}
n32 ,
复杂度降到:
∑
i
=
1
n
1
3
n
i
=
∫
0
n
1
3
n
x
d
x
=
O
(
n
2
3
)
\sum_{i=1}^{n^{\frac 13}}\sqrt{\frac ni}=\int_0^{n^{\frac 13}}\sqrt{\frac nx}\text{d}x=O(n^{\frac 23})
i=1∑n31in=∫0n31xndx=O(n32)
五、有趣的栗子
来源: BZOJ 3944
https://www.lydsy.com/JudgeOnline/problem.php?id=3944
(1)求
∑
i
=
1
n
μ
(
i
)
\sum_{i=1}^n\mu(i)
∑i=1nμ(i) 。
我们知道,
μ
∗
1
=
e
\mu*1=e
μ∗1=e (
e
e
e 为单位元,即
[
n
=
1
]
[n=1]
[n=1] )
于是:
∑
i
=
1
n
μ
(
i
)
=
1
−
∑
i
=
2
n
∑
j
=
1
⌊
n
i
⌋
μ
(
j
)
\sum_{i=1}^n\mu(i)=1-\sum_{i=2}^n\sum_{j=1}^{\lfloor\frac ni\rfloor}\mu(j)
i=1∑nμ(i)=1−i=2∑nj=1∑⌊in⌋μ(j)
对
⌊
n
i
⌋
\lfloor\frac ni\rfloor
⌊in⌋ 下界分块即可。
(2)求
∑
i
=
1
n
ϕ
(
i
)
\sum_{i=1}^n\phi(i)
∑i=1nϕ(i) 。
我们知道,
ϕ
∗
1
=
n
\phi*1=n
ϕ∗1=n 。
于是:
∑
i
=
1
n
ϕ
(
i
)
=
n
×
(
n
+
1
)
2
−
∑
i
=
2
n
∑
j
=
1
⌊
n
i
⌋
ϕ
(
j
)
\sum_{i=1}^n\phi(i)=\frac{n\times(n+1)}{2}-\sum_{i=2}^n\sum_{j=1}^{\lfloor\frac ni\rfloor}\phi(j)
i=1∑nϕ(i)=2n×(n+1)−i=2∑nj=1∑⌊in⌋ϕ(j)
同样下界分块。