杜教筛可以用来在非线性时间内求一个积性函数的前缀和,即 \(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)\)的数论函数。
这里列举一些常见的:
狄利克雷卷积
设 \(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)
\]
证毕。
例题
给定\(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
\]
这样就可以做了。可以用欧拉筛筛出欧拉函数的前缀和,使用整除分块进行优化。
给定\(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}})\)。
例题
给定正整数\(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解决。