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

一、引入

通常,在莫比乌斯反演的题目中会推出下面这样的式子:
∑ i = 1 n ⌊ n i ⌋ f ( i ) \sum_{i=1}^n\lfloor\frac ni\rfloor f(i) i=1ninf(i)
其中 f f f 是积性函数。
我们知道,当 1 ≤ i ≤ n 1\le i\le n 1in ⌊ 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) (fg)(n)dnf(d)g(dn)
如果 f f f g g g 为积性函数,那么 f ∗ g f*g fg 也是积性函数。

三、算法流程

设我们要求的值:
S ( n ) = ∑ i = 1 n f ( i ) S(n)=\sum_{i=1}^nf(i) S(n)=i=1nf(i)
首先找到一个积性函数 g g g ,使得
h ( n ) = ∑ i = 1 n ( f ∗ g ) ( i ) h(n)=\sum_{i=1}^n(f*g)(i) h(n)=i=1n(fg)(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=1ndif(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=1ng(d)1in,dif(di)=h(n)
满足所有 1 ≤ i ≤ n , d ∣ i 1\le i\le n,d|i 1in,di i d \frac id di 实际上就是所有满足 1 ≤ i ≤ ⌊ n d ⌋ 1\le i\le\lfloor\frac nd\rfloor 1idn 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=1ng(i)j=1inf(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=1ng(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=2ng(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=1n i +i=1n in
= ∫ 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=1n31in =0n31xn dx=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=1nμ(i)=1i=2nj=1inμ(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=1nϕ(i)=2n×(n+1)i=2nj=1inϕ(j)
同样下界分块。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值