杜教筛是对线性筛的优化,用于快速求数论函数前缀和。我们可以使用O(n)的线筛求出一般的数论函数的前缀和,杜教筛可以优化到。
问题:求解,是积性函数。
构造两个积性函数h,g。,杜教筛就是推导
思考这一步,将整个式子展开,把g(d)相同的放在一起。
我们假设
最后我们得到公式
求出
使用杜教筛的关键是,对g(x)的选取,要求h(x)的前缀和非常好求,递归求解。g(d)还能配合使用整除分块求和。
杜教筛求莫比乌斯函数前缀和
求
我们要求的就是上面的公式。首先确定g的选择。因为我们做过推导,。我们知道的前缀和特别好求,并且能配合整除分块。因此我们让g = 1,带入公式中。
杜教筛时间复杂度证明
单独看这个公式感觉时间复杂度特别大,我们根据整除分块的知识知道,。n最多被分为个。每个还会再分,其中最大的一个是,我开始一直感觉这个时间复杂度是大于O(n)的,虽然我知道已经求解的s(i)会记忆,但是每次合并的时间就要如果被记忆的s,用到的很少,那么很明显时间复杂度会大于。
R(n)是一个集合= 。
引理:对于任意正整数 n,,有 。
证明:因为,所以设。对于,有,当的时候有所以。
根据这个引理可知,s(n)无论递归多少次只会被分为个数。从小到大计算整除分块后的s(i),每个s(i)分块后的s(j)一定在前面被计算出来了,因此我们只需要花费递归1次合并的代价就可以了。
杜教筛采用预处理的方式优化,使用线筛的时间复杂度预处理出前s项
当S取时,整个算法时间复杂度最小,为
网友评论