《杜教筛》
杜教筛:算是筛法里特别实用的一个算法吧,复杂度是亚线性。
前置知识:
积性函数:
对于函数f,如果满足f[1] = 1,且当p,q互质时,满足f[p * q] = f[p] * f[q],那么这个函数即为积性函数。
当p,q不互质时都满足f[p * q] = f[p] * f[q],那么这个函数即为完全积性函数。
积性函数满足一个性质:两个积性函数相乘还是积性函数,这是非常重要的一步。
杜教筛就是用来筛积性函数前缀和的。
常见的一些积性函数:
欧拉函数$\phi(n) $
莫比乌斯函数$\mu(n) $
约数个数d(n)
约数和函数$\sigma (n)$
实用的完全积性函数:
元函数:$\varepsilon (n)$,$\varepsilon (n) = [n = 1]$
恒等函数:$I(n)$,值恒等于1
单位函数:$id(n)$,id(n) = n
狄利克雷卷积:
非常重要的一个知识。
有定义:$(f * g) (n) = \sum_{d | n}^{}f(d) * g(\frac{n}{d})$
表示将函数f卷函数g,以后都默认范围为n。
狄利克雷卷积满足:乘法交换律,结合律和分配率。
即:
$f * g = g * f$
$f * (g * h) = (f * g) * h$
$f * (g + h) = f * g + f * h$
从定义出发很容易证明上述三条。
给出一个很重要的性质:$f * \epsilon = f$
证明:$f * \epsilon = \sum_{d | n}^{} f[d] * \epsilon (\frac{n}{d})$
当d = n时有值,可得$f * \epsilon = f$
有了狄利克雷卷积就可以证明许多性质:如莫比乌斯反演 和一些函数。。
杜教筛:
假设要求的积性函数前缀和为$\sum_{i = 1}^{n}f(i)$
我们需要构造两个函数g,h,满足$g * f= h$(此处为狄利克雷卷积)
然后我们设$S(n) = \sum_{i = 1}^{n}f(i)$
那么,我们先求解$\sum_{i = 1}^{n}h(i)$
$\sum_{i = 1}^{n} h(i) = \sum_{i = 1}^{n}\sum_{d | i}^{}g(d) * f(\frac{i}{d}) = \sum_{d = 1}^{n} \sum_{i = 1}^{\frac{n}{d}}g(d) * f(i) = \sum_{d = 1}^{n}g(d) S(\frac{n}{d})$
将右边第一项分解出来可得:
$\sum_{i = 1}^{n} h(i) = \sum_{d = 1}^{n}g(d) S(\frac{n}{d}) = g(1) * S(n) + \sum_{d = 2}^{n}g(d) S(\frac{n}{d})$
那么就可得$g(1) * S(n) = \sum_{i = 1}^{n} h(i) - \sum_{d = 2}^{n}g(d) S(\frac{n}{d})$
所以我们构造的两个函数f,g的前缀和都需要能高速求解,那么就可以求解上诉式子了。
显然要先预处理$\sqrt{n}$的数据。
Record:杜教筛构造狄利克雷卷积(下面推导对于g(1) = 1时直接省略
1:$ans = \sum_{i = 1}^{n} \mu (i)$
因为$\sum_{d | n}^{}\mu (d) = [n = 1]$,所以可以构造狄利克雷卷积$u * I = \epsilon$
$S(n) = \sum_{i = 1}^{n} \epsilon (i) - \sum_{d = 2}^{n}g(d) * S(\frac{n}{d}) = 1 - \sum_{d = 2}^{n}S(\frac{n}{d})$
2:$ans = \sum_{i = 1}^{n}\phi (i)$
因为$\sum_{d | n}^{}\phi (d) = n$,所以可以构造狄利克雷卷积$\phi * I = id$
$S(n) = \sum_{i = 1}^{n} id(i) - \sum_{d = 2}^{n} I(d) * S(\frac{n}{d}) = \frac{n * (n + 1)}{2} - \sum_{d = 2}^{n}S(\frac{n}{d})$
3:$ans = \sum_{i = 1}^{n}i \phi (i)$
考虑狄利克雷卷积的形式:
$h(n) = \sum_{d | n}^{}f(d) * g(\frac{n}{d}) = \sum_{d | n}^{}d * \phi (d) * g(\frac{n}{d})$
仔细观察可以发现,我们最好能消去前面的d,且g下标为n / d,那么对g套用id函数。
得$h(n) = \sum_{d | n}^{}f(d) * g(\frac{n}{d}) = n \sum_{d | n}^{}\phi (d) = n^{2}$
平方的前缀和公式:n * (n + 1) * (2n + 1) / 6
那么可得$S(n) = \sum_{i = 1}^{n} i^{2} - \sum_{d = 2}^{n} id(d) * S(\frac{n}{d}) = \frac{n * (n + 1) * (2n + 1)}{2} - \sum_{d = 2}^{n} d * S(\frac{n}{d})$
4: