杜教筛

杜教筛用于求数论函数前缀和。

比如常见的莫比乌斯函数、欧拉函数。

n = 10^4, 我会for循环

当n = 10^6,我会线性筛

n = 10^9,我 。。。

杜教筛可以低于线性时间复杂度求解数论函数前缀和,\Theta(n^{\frac{2}{3}})

对于数论函数f,我们要求S(n) = \sum_{i = 1}^nf(i)

对于任意一个数论函数g

\sum_{i = 1}^n(f*g)(i)

=\sum_{i = 1}^n\sum_{d|i}f(d)g(\frac{i}{d})

=\sum_{i=1}^n\sum_{j=1}^{\left \lfloor \frac{n}{i} \right \rfloor}g(i)f(j)

=\sum_{i=1}^ng(i)\sum_{j=1}^{\left \lfloor \frac{n}{i} \right \rfloor}f(i)

=\sum_{i=1}^ng(i)S(\left \lfloor \frac{n}{i} \right \rfloor)

=g(1)S(n) + \sum_{i=2}^ng(i)S(\left \lfloor \frac{n}{i} \right \rfloor)

\Rightarrow g(1)S(n) = \sum_{i=1}^n(f*g)(i)-\sum_{i=2}^ng(i)S(\left \lfloor \frac{n}{i} \right \rfloor)

如果我们可以很快的算出 \sum_{i=1}^n(f*g)(i),然后用数论分块算出\sum_{i=2}^n g(i)S(\left \lfloor \frac{n}{i} \right \rfloor),我们就能很快得到g(1)S(n)

莫比乌斯函数

S(n) = \sum_{i = 1} ^n \mu(i)

f(i) = \mu(i)

\sum_{i = 1} ^n(1*\mu)(i) = \sum_{i = 1} ^nS(\left \lfloor \frac{n}{i} \right \rfloor), 由于1 * \mu = \varepsilon

1 = S(n) + \sum_{i = 2} ^ nS(\left \lfloor \frac{n}{i} \right \rfloor)

S(n) = 1 - \sum_{i = 2} ^nS(\left \lfloor \frac{n}{i} \right \rfloor)

欧拉函数

\sum_{i = 1} ^ n \varphi(i)

f(i) = \varphi(i)

\sum_{i=1}^n(1*\varphi)(i) = \sum_{i=1}^nS(\left \lfloor \frac{n}{i}\right \rfloor),由于 1*\varphi = ID

\frac{1}{2}n(n+1) =S(n)+ \sum_{i=2}^nS(\left \lfloor \frac{n}{i} \right \rfloor)

S(n) = \frac{1}{2}n(n+1) - \sum_{i=2}^nS(\left \lfloor \frac{n}{i} \right \rfloor)

当 n = 10^4, 我会for循环

当 n = 10^6,我会线性筛

当 n = 10^9,我会杜教筛

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值