杜教筛被用于处理一类数论函数的前缀和问题。对于数论函数 ,杜教筛可以在低于线性时间的复杂度内计算

算法思想

我们想办法构造一个 关于 的递推式。

对于任意一个数论函数 ,必满足:

其中 为数论函数 狄利克雷卷积

略证

就是对所有 的做贡献,因此变换枚举顺序,枚举 ,(分别对应新的

那么可以得到递推式:

假如我们可以构造恰当的数论函数 使得:

  1. 可以快速计算
  2. 可以快速计算 的前缀和,以用数论分块求解

则我们可以在较短时间内求得

注意

无论数论函数 是否为积性函数,只要可以构造出恰当的数论函数 , 便都可以考虑用杜教筛求 的前缀和。

如考虑 , 显然 不是积性函数,但可取 , 从而:

计算 的时间复杂度均为 , 故可以考虑使用杜教筛。

时间复杂度

。利用数论分块的 性质 可知,对任意的 ,都有 。也就是说,使用记忆化之后,只需要对所有 计算一次 就可以得到 的值。而这些点的数目

设计算 的时间复杂度均为 . 设计算 的时间复杂度为 , 则:

若我们可以预处理出一部分 , 其中 。设预处理的时间复杂度为 ,则此时的 为:

(如线性筛),由均值不等式可知:当 时, 取得最小值 .

例题

问题一

的值,.

[list2tab]

  • 莫比乌斯函数前缀和 我们知道:

    时间复杂度的推导见 时间复杂度 一节。

    对于较大的值,需要用 map/unordered_map 存下其对应的值,方便以后使用时直接使用之前计算的结果。

  • 欧拉函数前缀和 当然也可以用杜教筛求出 的前缀和,但是更好的方法是应用莫比乌斯反演。

    === ” 莫比乌斯反演 ”

    由于题目所求的是 $\sum_{i=1}^n \sum_{j=1}^i [\gcd(i,j)=1]$, 所以我们排除掉 $i=1,j=1$ 的情况,并将结果除以 $2$ 即可。
    
    观察到,只需求出莫比乌斯函数的前缀和,就可以快速计算出欧拉函数的前缀和了。时间复杂度 $O\left(n^{\frac 2 3}\right)$.
    

    === ” 杜教筛 ” 求 .

    同样的,$\varphi * 1=\operatorname{id}$, 从而:
    
    $$
        \begin{aligned}
            S(n) & =\sum_{i=1}^n i - \sum_{i=2}^n S\left(\left\lfloor\frac{n}{i}\right\rfloor\right)    \\
                 & =\frac{1}{2}n(n+1) - \sum_{i=2}^n S\left(\left\lfloor\frac{n}{i}\right\rfloor\right)
        \end{aligned}
    $$
    

问题二

大意:求

其中 , 是质数。

利用 做莫比乌斯反演化为:

其中

做数论分块, 的前缀和用杜教筛处理:

需要构造积性函数 ,使得 能快速求和。

单纯的 的前缀和可以用 的杜教筛处理,但是这里的 多了一个 ,那么我们就卷一个 上去,让它变成常数:

化一下卷积:

再化一下 :

分块求解即可。

参考资料

  1. 任之洲,2016,《积性函数求和的几种方法》,2016 年信息学奥林匹克中国国家队候选队员论文
  2. 杜教筛的时空复杂度分析 - riteme.site