杜教筛

杜教筛

 

1.概述

 

杜教筛是用以解决积性函数前缀和的算法。

在学习了莫比乌斯反演之后,杜教筛的过程就会显得简单而自然。

 

2.基本形式 

 

对于积性函数f,我们定义如下函数:

S(x)=\sum_{i=1}^{x}f(i)

构造积性函数 h,g,使得 f*g=h

显然 :

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

进一步转化:

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

也就是:

\sum_{i=1}^{n}h(i)=\sum_{d=1}^{n}g(d)\cdot S(\left \lfloor \frac{n}{d} \right \rfloor)

把右式的第一项提出:

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

进一步整理,得:

g(1)S(n)=\sum_{i=1}^{n}h(i)-\sum_{d=2}^{n}g(d)\cdot S(\left \lfloor \frac{n}{d} \right \rfloor)

显然,如果我们能够快速算出任意的  h(i) ,就能够通过数论分块在O(n^{\frac{2}{3}})的时间内求出S

 

3.一些常见函数的杜教筛形式

    3.1  \mu函数的前缀和

有一个显而易见的结论:\mu*I=\epsilon

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

由杜教筛易得:

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

    3.2  \varphi函数的前缀和

有一个显而易见的结论:\varphi*I=id

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

由杜教筛易得:

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

4.一些总结

 

杜教筛作为一个数论算法,代码实现不算太难,但有几个小细节需要注意:

  • S(i)  是需要全部记录的,需要用到unordered_map或者 map(多一个log)。
  • 实测unordered_map、map,时间差不多
  • 容易爆long long

平时遇到积性函数求和,并且n高达10^9,10^{10},10^{11},就可以尝试用杜教筛来解。

当然杜教筛有一个弊端:没有一个系统的构造函数的方法。

如果遇到一个难以构造的积性函数,可以尝试使用 min_25筛、洲阁筛,(啥?你不会,我也不会qwq),那自求多福吧(QAQ~)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值