杜教筛
1.概述
杜教筛是用以解决积性函数前缀和的算法。
在学习了莫比乌斯反演之后,杜教筛的过程就会显得简单而自然。
2.基本形式
对于积性函数,我们定义如下函数:
构造积性函数 ,使得
显然 :
进一步转化:
也就是:
把右式的第一项提出:
进一步整理,得:
显然,如果我们能够快速算出任意的 ,就能够通过数论分块在的时间内求出。
3.一些常见函数的杜教筛形式
3.1 函数的前缀和
有一个显而易见的结论:
设
由杜教筛易得:
3.2 函数的前缀和
有一个显而易见的结论:
设
由杜教筛易得:
4.一些总结
杜教筛作为一个数论算法,代码实现不算太难,但有几个小细节需要注意:
- 是需要全部记录的,需要用到unordered_map或者 map(多一个log)。
- 实测unordered_map、map,时间差不多
- 容易爆long long
平时遇到积性函数求和,并且高达,就可以尝试用杜教筛来解。
当然杜教筛有一个弊端:没有一个系统的构造函数的方法。
如果遇到一个难以构造的积性函数,可以尝试使用 _筛、洲阁筛,(啥?你不会,我也不会qwq),那自求多福吧(QAQ~)。