前言:
据CCH和LJH说,杜教筛似乎是一个非常套路的东西,几乎所有的杜教筛的题目推理方式都是一模一样的(但实测有些推理还是很恶心的)。所以复习杜教筛不需要太多时间,粗略看一遍,留下印象即可。
杜教筛其实是一种简化运算的推理方式,它的使用条件并不仅限于积性函数(?),只是积性函数可以将复杂度进一步优化。
例题:求欧拉函数前缀和
因为杜教筛是一种推理方式,所以直接给出例题反而容易上手。
欧拉函数的定义这里就不再赘述。
需要知道的是欧拉函数 (φ) ( φ ) 的一个特殊性质:
∑d|nφ(d)=n ∑ d | n φ ( d ) = n
形如 ∑d|nf(d)=A ∑ d | n f ( d ) = A 这个性质是极为重要的,我们整个算法都是基于这个性质而来。
下面开始推导:
φ(n)=n−∑d|n,d<nφ(d) φ ( n ) = n − ∑ d | n , d < n φ ( d )
那么
∑i=1i≤nφ(i)=∑i=1i≤n(i−∑d|i,d<iφ(d)) ∑ i = 1 i ≤ n φ ( i ) = ∑ i = 1 i ≤ n ( i − ∑ d | i , d < i φ ( d ) )
现在我们改变枚举变量:我们枚举 id i d 的值,即枚举i对d的倍数,因为i≠d,所以从2开始
∑i=1i≤nφ(i)=n∗(n+1)2−∑