《杜教筛》

杜教筛:算是筛法里特别实用的一个算法吧,复杂度是亚线性。

前置知识:

积性函数:
对于函数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:

posted @ 2020-10-31 07:14  levill  阅读(227)  评论(0编辑  收藏  举报