[学习笔记]杜教筛法的原理

一、引入

通常,在莫比乌斯反演的题目中会推出下面这样的式子:

i = 1 n n i f ( i )

其中 f 是积性函数。
我们知道,当 1 i n n i 的取值只有 O ( n ) 种。
于是我们可以对下界分块,利用 f 的前缀和求解,从而实现一次 O ( n ) 的复杂度。
但如果 n = 10 9 时,如何求 f 的前缀和呢?
下面就来介绍 求积性函数前缀和的算法:杜教筛。

二、前置芝士:狄利克雷 (Dirichlet) 卷积

两个数论函数函数 f g 的狄利克雷卷积定义为:

( f g ) ( n ) d | n f ( d ) g ( n d )

如果 f g 为积性函数,那么 f g 也是积性函数。

三、算法流程

设我们要求的值:

S ( n ) = i = 1 n f ( i )

首先找到一个积性函数 g ,使得
h ( n ) = i = 1 n ( f g ) ( i )

可以被 O ( 1 ) 计算出, g ( n ) 值及前缀和也能被 O ( 1 ) 计算出。
于是有:
i = 1 n d | i f ( i d ) g ( d ) = h ( n )

把枚举约数改成枚举倍数:
d = 1 n g ( d ) 1 i n , d | i f ( i d ) = h ( n )

满足所有 1 i n , d | i i d 实际上就是所有满足 1 i n d i
i = 1 n g ( i ) j = 1 n i f ( j ) = h ( n )

于是:
i = 1 n g ( i ) S ( n i ) = h ( n )

由于 n 1 = n ,故:
g ( 1 ) S ( n ) = h ( n ) i = 2 n g ( i ) S ( n i )

n i 下界分块。使用记忆化搜索就能在 O ( n 3 4 ) 内求出一个前缀和。
为了提高效率,我们还需要结合线性筛,筛出 n 2 3 内的所有 S 值。
这样,我们实现了 O ( n 2 3 ) S ( n )
复杂度分析需要用到积分方面的知识 ,本蒟蒻就不会了

四、有趣的栗子

来源: BZOJ 3944
https://www.lydsy.com/JudgeOnline/problem.php?id=3944
(1)求 i = 1 n μ ( i )
我们知道, μ 1 = e e 为单位元,即 [ n = 1 ]
于是:

i = 1 n μ ( i ) = 1 i = 2 n j = 1 n i μ ( j )

n i 下界分块即可。
(2)求 i = 1 n ϕ ( i )
我们知道, ϕ 1 = n
于是:
i = 1 n ϕ ( i ) = n × ( n + 1 ) 2 i = 2 n j = 1 n i ϕ ( j )

同样下界分块。

猜你喜欢

转载自blog.csdn.net/xyz32768/article/details/82221364