Loading

杜教筛学习笔记

杜教筛可以用来在非线性时间内求一个积性函数的前缀和,即 \(S(n) = \sum_{i=1}^{n} f(i)\)

前置知识

积性函数

积性函数:若有数论函数\(f\)对于任意互质整数\(a, b\)都有\(f(a \cdot b) = f(a) \cdot f(b)\),则\(f\)为积性函数。

完全积性函数:对于任意整数\(a,b\)\(f(a \cdot b)=f(a) \cdot f(b)\)的数论函数。

这里列举一些常见的:

  • 积性函数:\(\varphi,\mu,\sigma,d\)

  • 完全积性函数:\(\epsilon,I,id\)

狄利克雷卷积

\(f, g\) 是两个数论函数,它们的狄利克雷卷积是:

\[(f \cdot g)(n) = \sum \limits _{d | n} f(d) \cdot g(\frac{n}{d}) \]

它满足交换律、结合律、分配律

单位元是\(\epsilon\),即\(f \cdot \epsilon = f\)

这里有几个常用的等式:

\[\mu \cdot I = \epsilon \\ \varphi \cdot I = id \\ \mu \cdot id = \varphi \]

整除分块

很多反演题目都会有一个这样的形式:\(\large \sum_{i=1}^n \left\lfloor \frac{n}{i} \right\rfloor\)

对于这个式子,我们可以朴素地进行\(O(N)\)的计算。但是很多情况下,这种做法的复杂度是不被允许的。

我们对于每一个\(n\)进行打表,发现有大量的值是重复的,而每一个值按顺序排布,呈块状形式,并且每一块的末尾为\(\left\lfloor \dfrac{n}{\left\lfloor \frac{n}{i} \right\rfloor} \right\rfloor\)。至此,我们就可以在\(O(\sqrt{N})\)的时间内进行计算。

但是上式经常会乘上一些积性函数,这时就可以对积性函数求一个前缀和,每一次跳块也就相当于跳过了这一整段的函数和。

一般的整除分块形式:

for (int l=1,r=0; l<=n; l=r+1) {
	r=n / (n / l);
	// Your Code
}

莫比乌斯反演

若有

\[F(n) = \sum_{d \mid n}f(d) \]

\[f(n) =\sum_{d \mid n} \mu(d) \cdot F(\frac{n}{d}) = \sum_{d \mid n} \mu(\frac{n}{d}) \cdot F(d) \]

证明:

我们用狄利克雷卷积来表示上面的式子,得到\(F = f \cdot I\)

\(F\)卷上\(\mu\)得到

\[F \cdot \mu = f \cdot I \cdot \mu \\ F \cdot \mu = f \cdot (I \cdot \mu) = f \cdot \epsilon = f \\ f = F \cdot \mu \]

代入狄利克雷卷积原式:

\[f(n) =\sum_{d \mid n} \mu(d) \cdot F(\frac{n}{d}) = \sum_{d \mid n} \mu(\frac{n}{d}) \cdot F(d) \]

证毕。

例题

Luogu P2398 GCD SUM

给定\(n\),求

\[\sum_{i=1}^{n}\sum_{j=1}^{n} \gcd(i,j) \]

做法

欧拉函数有一个性质:\(\large \sum_{d \mid n} \varphi(d) = n\)

于是我们可以将原式子套路一下:

\[\sum_{i=1}^{n}\sum_{j=1}^{n} \gcd(i,j) \\ = \sum_{i=1}^{n}\sum_{j=1}^{n} \sum_{d \mid \gcd(i,j)} \varphi(d) \\ = \sum_{i=1}^{n}\sum_{j=1}^{n} \sum_{d \mid i, d \mid j} \varphi(d) \]

\(d\)提到前面去:

\[=\sum_{d=1}^{n} \sum_{i=1}^{\left\lfloor\frac{n}{d}\right\rfloor} \sum_{j=1}^{\left\lfloor\frac{n}{d}\right\rfloor}\varphi(d) \\ = \sum_{d=1}^{n} \varphi(d) \cdot \left\lfloor\frac{n}{d}\right\rfloor \cdot \left\lfloor\frac{n}{d}\right\rfloor \]

这样就可以做了。可以用欧拉筛筛出欧拉函数的前缀和,使用整除分块进行优化。

Luogu P2257 YY的GCD

给定\(n,m\),求

\[\sum_{i=1}^n\sum_{j=1}^m [\gcd(i,j)\in Prime] \]

做法

我们不知道\(\gcd(i,j)\)是多少,所以我们枚举它(这里假定\(n \leqslant m\)):

\[\sum_{p \in Prime}^n \sum_{i=1}^n\sum_{j=1}^m [\gcd(i,j)=p] \]

同时除以\(k\)得到

\[\sum_{p \in Prime}^n \sum_{i=1}^{\left\lfloor\frac{n}{p}\right\rfloor} \sum_{j=1}^{\left\lfloor\frac{m}{p}\right\rfloor} [\gcd(i,j)=1] \]

利用一下\(\mu\)的性质:\(\large \sum_{d \mid n} \mu(d) = [n = 1]\)

像上一题那样,把后面替换掉:

\[\sum_{p \in Prime}^n \sum_{i=1}^{\left\lfloor\frac{n}{p}\right\rfloor} \sum_{j=1}^{\left\lfloor\frac{m}{p}\right\rfloor} \sum_{d \mid \gcd(i,j)} \mu(d) \]

枚举\(d\),把\(d\)提到前面。因为\(d \mid \gcd(i,j)\),所以\(i,j\)\(d\)的倍数,把它们上限全都除上\(d\),后面再乘回去,发现个数可直接求,所以去掉两个求和:

\[\sum_{p \in Prime}^n \sum_{d=1}^{\left\lfloor\frac{n}{p}\right\rfloor} \mu(d) \cdot \left\lfloor\frac{n}{pd}\right\rfloor \cdot \left\lfloor\frac{m}{pd}\right\rfloor \]

但是这样的复杂度还是过不去。我们继续优化:设\(T = p \cdot d\),枚举\(T\),再次提到前面去:

\[\sum_{T=1}^{n} \sum_{p \mid T, p \in Prime} \left\lfloor \frac{n}{T} \right\rfloor \cdot \left\lfloor \frac{m}{T} \right\rfloor \cdot \mu(\frac{T}{p}) \]

而后面还是可以预处理+整除分块进行优化。

杜教筛

一般式

我们要求\(\large \sum_{i=1}^{n} f(i)\)

用狄利克雷卷积,设有积性函数\(F,g\)满足\(F = f \cdot g\),记\(S(n)\)为上式。如果说我们的\(F,g\)都是很容易求的函数,那么我们就可以用它们来求\(f\)。那么,我们推一下\(F\)的前缀和:

\[\sum_{i=1}^{n}F(i) = \sum_{i=1}^{n}\sum_{d | n} g(d) \cdot f(\frac{n}{d}) \\ = \sum_{d=1}^{n}g(d) \cdot \sum_{i=1}^{\left\lfloor \frac{n}{d} \right\rfloor} f(i) \\ = \sum_{d=1}^{n}g(d) \cdot S(\frac{n}{d}) \]

我们要求的是\(S(n)\),所以我们从右式中拆一个出来,即把\(i=1\)单独考虑:

\[\sum_{i=1}^{n}F(i) = g(1) \cdot S(n) + \sum_{d=2}^{n}g(d) \cdot S(\frac{n}{d}) \\ g(1) \cdot S(n) = \sum_{i=1}^{n}F(i) - \sum_{d=2}^{n}g(d) \cdot S(\frac{n}{d}) \]

这就是杜教筛的一般式。

复杂度证明

首先给出杜教筛的复杂度:

\[\Theta(\sum_{i=0}^{\sqrt n} \sqrt i + \sum_{i=0}^{\sqrt n} \sqrt {n \over i}) \]

积分求近似:

\[\begin{aligned} & \Theta(\sum_{i=0}^{\sqrt n} \sqrt i + \sum_{i=0}^{\sqrt n} \sqrt {n \over i}) \\&= \Theta (\int_0^{\sqrt n} (\sqrt x) {\mathrm d}x+\int_0^{\sqrt n} ({\sqrt n \over \sqrt x}) {\mathrm d}x) \\&= \Theta(\frac{2}{3}{\sqrt n}^{\frac{3}{2}} + \sqrt n \cdot 2{{\sqrt n}^{\frac{1}{2}}}) \\&= \Theta(n^{3 \over 4}) \end{aligned} \]

如果我们预处理前 \(k\) 的部分,则可以优化复杂度。当 \(k = n^{2 \over 3}\) 时有理论最优复杂度:

\[\begin{aligned} &\Theta(k+\sum_{i=0}^\frac{n}{k} \sqrt{\frac{n}{i}})\\ &=\Theta(k+\int_0^{\frac{n}{k}}\sqrt{\frac{n}{x}}\mathrm dx)\\ &=\Theta(k+2\sqrt n \sqrt{\frac{n}{k}}) \\ &=\Theta(k+2nk^{-\frac{1}{2}}) \\ &\geqslant \Theta(2\sqrt{2nk^{\frac{1}{2}}}) \end{aligned} \]

最后一步是均值不等式,忽略常数后当 \(k = n^{\frac{2}{3}}\) 时取到,原式最小值即为 \(\Theta(n^{\frac{2}{3}})\)

例题

Luogu P4213 【模板】杜教筛(Sum)

给定正整数\(n\),求:

\[ans1 = \sum_{i=1}^{n} \varphi(i) \\ ans2 = \sum_{i=1}^{n} \mu(i) \]

做法

\(\mu \cdot I = \epsilon\),很自然想到\(F = \epsilon, g = I\),代入原式子即得

\[S(n) = 1 - \sum_{d=2}^{n}S(\frac{n}{d}) \]

同时,因为\(\varphi \cdot I = id\),代入一般式得

\[S(n) = \frac{n \cdot (n+1)}{2} - \sum_{d=2}^{n}S(\frac{n}{d}) \]

类似地,我们使用整除分块+记忆化搜索解决。但是出杜教筛的题\(n\)一般较大,可以手写个 hash 或者直接使用unordered_map解决。

posted @ 2020-12-15 22:07  LewisLi  阅读(250)  评论(0)    收藏  举报