今天学了一下杜教筛,感觉并没有想象中的那么困难
积性函数
∀
g
c
d
(
n
,
m
)
=
1
\forall gcd(n,m)=1
∀gcd(n,m)=1,都有
f
(
n
m
)
=
f
(
n
)
f
(
m
)
f(nm)=f(n)f(m)
f(nm)=f(n)f(m)那么称
f
f
f为积性函数
常见积性函数,
μ
,
φ
,
ϵ
,
I
,
i
d
\mu,\varphi,\epsilon,I,id
μ,φ,ϵ,I,id
ϵ
(
n
)
=
[
n
=
1
]
,
I
(
n
)
=
1
,
i
d
(
n
)
=
n
\epsilon(n)=[n=1],I(n)=1,id(n)=n
ϵ(n)=[n=1],I(n)=1,id(n)=n
狄利克雷卷积
若
f
,
g
f,g
f,g是两个积性函数,它们的狄利克雷卷积是
(
f
∗
g
)
(
n
)
=
∑
d
∣
n
f
(
d
)
g
(
n
d
)
(f*g)(n)=\sum_{d|n}f(d)g(\frac{n}{d})
(f∗g)(n)=∑d∣nf(d)g(dn)
满足交换律,结合律
根据部分积性函数的性质可以得到
μ
∗
I
=
ϵ
,
φ
∗
I
=
i
d
,
μ
∗
i
d
=
φ
\mu*I=\epsilon,\varphi*I=id,\mu*id=\varphi
μ∗I=ϵ,φ∗I=id,μ∗id=φ
杜教筛
已知
f
f
f是积性函数,如何快速求
S
(
n
)
=
∑
i
=
1
n
f
(
i
)
S(n)=\sum_{i=1}^nf(i)
S(n)=∑i=1nf(i),所谓快速求就是比
O
(
n
)
O(n)
O(n)快
考虑找到另一个积性函数
g
g
g,那么
∑
i
=
1
n
(
f
∗
g
)
(
i
)
\sum_{i=1}^n(f*g)(i)
i=1∑n(f∗g)(i)
=
∑
i
=
1
n
∑
d
∣
i
g
(
d
)
f
(
i
d
)
=\sum_{i=1}^n\sum_{d|i}g(d)f(\frac{i}{d})
=i=1∑nd∣i∑g(d)f(di)
=
∑
d
=
1
n
g
(
d
)
∑
i
=
1
⌊
n
d
⌋
f
(
i
)
=\sum_{d=1}^ng(d)\sum_{i=1}^{\lfloor \frac{n}{d}\rfloor}f(i)
=d=1∑ng(d)i=1∑⌊dn⌋f(i)
=
∑
d
=
1
n
g
(
d
)
S
(
⌊
n
d
⌋
)
=\sum_{d=1}^ng(d)S(\lfloor \frac{n}{d}\rfloor)
=d=1∑ng(d)S(⌊dn⌋)
g
(
1
)
S
(
n
)
=
∑
i
=
1
n
(
f
∗
g
)
(
i
)
−
∑
d
=
2
n
g
(
d
)
S
(
⌊
n
d
⌋
)
g(1)S(n)=\sum_{i=1}^n(f*g)(i)-\sum_{d=2}^ng(d)S(\lfloor \frac{n}{d}\rfloor)
g(1)S(n)=i=1∑n(f∗g)(i)−d=2∑ng(d)S(⌊dn⌋)
如果
g
g
g的前缀和
f
∗
g
f*g
f∗g的前缀和都能够
O
(
1
)
O(1)
O(1)求的话,后面数论分块递归求解再记忆化一下就可以做到
O
(
n
3
4
)
O(n^{\frac{3}{4}})
O(n43)不会证
如果提前用线筛预处理一下
n
2
3
n^{\frac{2}{3}}
n32以内的
f
f
f,时间复杂度可以达到
O
(
n
2
3
)
O(n^{\frac{2}{3}})
O(n32)
P4213 【模板】杜教筛(Sum)
分别取
f
=
μ
,
g
=
I
,
f
∗
g
=
ϵ
f=\mu,g=I,f*g=\epsilon
f=μ,g=I,f∗g=ϵ和
f
=
φ
,
g
=
I
,
f
∗
g
=
i
d
f=\varphi,g=I,f*g=id
f=φ,g=I,f∗g=id