今年的GDKOI居然考了反演,还要用杜教筛,狠狠的把我骇了一跳,
回来在51nod上随便点开几题看起来像是反演的题,发现都是要用杜教筛(这RP~),
好吧好吧,那就学杜教筛咯~
杜教筛的套路
有几个大家都很熟悉的式子:
∑
d
∣
n
μ
(
d
)
=
[
n
=
1
]
\sum_{d|n}\mu(d)=[n=1]
d∣n∑μ(d)=[n=1]
根据这个,再写出一个式子:
∑
i
=
1
n
∑
d
∣
i
μ
(
d
)
=
1
\sum_{i=1}^n\sum_{d|i}\mu(d)=1
i=1∑nd∣i∑μ(d)=1
∑
i
=
1
n
∑
j
=
1
⌊
n
i
⌋
μ
(
j
)
=
1
\sum_{i=1}^n\sum_{j=1}^{\lfloor\frac{n}{i}\rfloor}\mu(j)=1
i=1∑nj=1∑⌊in⌋μ(j)=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{n}{i}\rfloor}\mu(j)
i=1∑nμ(i)=1−i=2∑nj=1∑⌊in⌋μ(j)
于是
μ
\mu
μ的前缀和就可以求了,
其他就是乘了一些奇怪的数也差不多是这样化(见后文)。
记得加上哈希记忆化。
其实并不用哈希,
我们发现,因为我们预处理了至少
n
\sqrt n
n个,
所以我们要算的所有的数都是小于
n
\sqrt n
n的,
当我们在计算n的答案时,在计算过程中所要访问的所有数x,它的
n
/
x
n/x
n/x的值都是唯一的,
所以我们就直接用
n
/
x
n/x
n/x作为它的哈希值,
计算下一个答案时再清空即可,
关于狄利克雷卷积的先挖坑(逃)
#复杂度
杜教筛的复杂度:
O
(
n
2
3
)
O(n^{\frac{2}{3}})
O(n32)
然而我并不会证明QwQ
转载唐老师的博客
【51nod 1244】莫比乌斯函数之和
求:
∑
i
=
a
b
μ
(
i
)
\sum_{i=a}^b\mu(i)
i=a∑bμ(i)
这个直接求出1b的减去1(a-1)的即可。
#其他例题
例题里面会有杜教筛其他情况的详细讲解(按难度排序)
【51nod 1239】欧拉函数之和
【BZOJ 3944】Sum(双倍经验)
【51nod 1237】最大公约数之和 V3
【51nod 1238】最小公倍数之和 V3
【51NOD 1227】平均最小公倍数(双倍经验)