铃悬的数学小讲堂——杜教筛

铃悬

2018-12-03 10:42:18

Personal

##### # 铃悬的数学小讲堂——杜教筛 本篇算是[【狄利克雷卷积及莫比乌斯反演】](https://lx-2003.blog.luogu.org/mobius-inversion)篇的后续 qwq。 本篇在读者掌握莫比乌斯反演与狄利克雷卷积的前提下,讲述了杜教筛算法,并伴有若干例题;另外还解释了如何利用贝尔级数更方便的使用杜教筛(要求具有一定生成函数知识)。 如果掌握莫比乌斯反演,也建议看一遍上篇博客;因为可能某些符号不太一样。 ## -2.符号及规定 同上篇。为方便此处再次写出: 1. $[P]$ 是指,当 $P$ 为真时,式子的值是 $1$ ;当 $P$ 为假时,式子的值是 $0$ 。// 可以理解成, `P` 是一个 0/1 布尔值, $[P]$ 就是 `(int)P`。 2. $a\mid b$ 是指 $b$ 被 $a$ 整除,即存在一个整数 $k$ 使得 $b=ka$ ;$n\perp m$ 是指 $n$ 与 $m$ 互质(注意,$1\perp1$ 是成立的)。 3. 数论函数(见下)用小写粗体字母或普通希腊文字母(如 ${\bf f,g,h},\mu,\epsilon$ )表示。// QAQ希腊文字母不能粗体 ## -1.前备知识 至少要理解莫比乌斯反演篇中的知识(即使不知道证明)qwq。 ## 0.数论分块 对于一个像 $F(n)=\sum_{i=1}^n f(i)\lfloor\frac ni\rfloor$ 这样的式子,如果我们可以 $O(1)$ 求出 $f(i)$ 的区间和,那么则可以在 $O(\sqrt n)$ 的复杂度内计算 $F(n)$ 。这依赖于以下引理: #### 引理 0.1 > 不同的 $\lfloor\frac ni\rfloor$ 只有 $O(\sqrt n)$ 种。 证明实际上很简单:如果 $i\geq\sqrt n$,那么 $1\leq\lfloor\frac ni\rfloor\leq\sqrt n$ ,又只取整数值,自然只有 $O(\sqrt n)$ 种取值。否则 $i<\sqrt n$,但这样的 $i$ 只有 $\sqrt n$ 种,自然也只会有 $O(\sqrt n)$ 种取值。 至于如何找出每一种取值,以及确定每个值对应的 $i$ 的区间,可以参考以下代码: ```cpp int ans = 0; for (int i = 1, j; i <= n; i = j + 1) { j = n / (n / i); // j 为最大的满足 floor(n/t)=floor(n/i) 的 t ans += (n / i) * S(i, j); } ``` 代码中 $S(a,b)$ 指 $\sum_{i=a}^n f(i)$。这段代码即可求出 $\sum_{i=1}^n f(i)\lfloor\frac ni\rfloor$。 至于代码中的注释,则是因为 $$\left\lfloor\frac nt\right\rfloor\geq\left\lfloor\frac ni\right\rfloor\iff \frac nt\geq\left\lfloor\frac ni\right\rfloor\iff t\leq\frac n{\left\lfloor\frac ni\right\rfloor}\iff t\leq\left\lfloor\frac n{\left\lfloor\frac ni\right\rfloor}\right\rfloor$$ 所以 t 的最大值就是 `n/(n/i)` 。 如果求和上界是 $m$ 而不是 $n$ ($m\leq n$),那就吧循环条件写成 $i\leq m$ 并令 `j=min(m,n/(n/i))` 即可。$\sum_{i=1}^n f(i)g(\lfloor\frac ni\rfloor)$ 也可以用相同求法求。 同样的,如果求 $\sum_{i=1}^{\min(n,m)}f(i)\lfloor\frac ni\rfloor\lfloor\frac mi\rfloor$,也只需要令 `j=min(n/(n/i),m/(m/i))`,复杂度仍旧是 $O(\sqrt{\max(n,m)})$。 ## 1.杜教筛 如果给定函数 $\bf f,g$,令 ${\bf S}(n)=\sum_{i=1}^n{\bf f}(i)$,则有 $$\sum_{i=1}^n({\bf f*g})(i)=\sum_{i=1}^n\sum_{xy=i}{\bf f}(x){\bf g}(y)=\sum_{y=1}^n{\bf g}(y)\sum_{xy\leq n}{\bf f}(x)=\sum_{y=1}^n{\bf g}(y){\bf S}\left(\left\lfloor\frac ny\right\rfloor\right)$$ 换句话说, $${\bf g}(1){\bf S}(n)=\sum_{i=1}^n({\bf f*g})(i)-\sum_{y=2}^n{\bf g}(y){\bf S}\left(\left\lfloor\frac ny\right\rfloor\right)$$ 这是由上面的等式右侧除了 $y=1$ 一项之外都移项到左边得到的。 由此我们可以得到一个 ${\bf S}$ 的计算方法(假设 $({\bf f*g})(i)$ 的前缀和与 ${\bf g}(i)$ 的区间和都可以 $O(1)$ 计算,以下计算复杂度时亦作此假设): ```cpp int S(int n) { int ans = ???; // \sum_{i=1}^n(f*g)(i) for (int i = 2, j; i <= n; i = j + 1) { j = n / (n / i); ans -= Sg(i, j) * S(n / i); } ans /= g1; return ans; } ``` 其中 `ans` 初值为 $\sum_{i=1}^n({\bf f*g})(i)$,${\bf Sg}(i,j)=\sum_{k=i}^j{\bf g}(k)$。 这段代码如何优化复杂度呢?首先估计计算 ${\bf S}(N)$ 的过程中产生了多少递归计算。 以下,我们以 $N$ 指最初给出的 $n$,以 $n$ 指递归调用产生的 $n$。 #### 引理1.1 > 对于任意正整数 $x,y,z$,有 $\left\lfloor\frac{\left\lfloor\frac zx\right\rfloor}y\right\rfloor=\left\lfloor\frac z{xy}\right\rfloor$ 证明也很简单:假设 $z=ax+b,a=cy+d$,其中 $0\leq b<x,0\leq d<y$,那么显然 $\left\lfloor\frac zx\right\rfloor=a,\left\lfloor\frac ay\right\rfloor=c$,于是等号左边就等于 $c$。同样的,我们有 $z=cxy+(dx+b)$,其中 $0\leq dx+b\leq(y-1)x+(x-1)=xy-1<xy$,所以 $\left\lfloor\frac z{xy}\right\rfloor=c$。所以等号左右相等。 由此可以发现,上面的代码在计算 ${\bf S}(N)$ 时,产生的(直接的或间接的)递归计算中的 $n$ 都是某个 $\left\lfloor\frac Nx\right\rfloor$(因为如果这次的 $n$ 是 $\lfloor\frac nx\rfloor$,下次一定是某个 $\left\lfloor\frac{\lfloor\frac nx\rfloor}i\right\rfloor=\lfloor\frac n{xi}\rfloor$),从而根据引理 0.1 只有 $O(\sqrt N)$ 次递归调用(如果 $n$ 相等的只计算一次的话),记忆化即可。 如果略去递归调用的复杂度,显然计算一次 ${\bf S}(n)$ 是 $O(\sqrt n)$。根据引理 0.1 的证明过程可知递归调用的 $n$ 分别为 $1,2,\dots,\sqrt N,\lfloor\frac N1\rfloor,\lfloor\frac N2\rfloor,\dots\lfloor\frac N{\sqrt N}\rfloor$。于是复杂度为 $$O\left(\sum_{i=1}^{\sqrt N}\sqrt i+\sum_{i=1}^{\sqrt N}\sqrt{\left\lfloor\frac Ni\right\rfloor}\right)=O\left(\sum_{i=1}^{\sqrt N}\sqrt{\left\lfloor\frac Ni\right\rfloor}\right)=O\left(\int_1^{\sqrt N}\sqrt{\frac Nx}{\rm d}x\right)=O\left(N^{\frac34}\right)$$ 第一步等号是因为后面的求和项显然比左边的大,所以在大 $O$ 符号中左边的可以省略。第二步等号为积分近似。 但是我们不能满足于此。我们发现如果对于较小的 $n$ 仍然 $O(\sqrt n)$ 计算 ${\bf S}$ 是不明智的,因为大部分情况下我们可以 $O(n)$ 预处理出 ${\bf S}(1),{\bf S}(2),\dots{\bf S}(n)$(利用线性筛一类)。我们如果预处理出 $1\dots N^c(c>\frac12)$ 的答案,那么需要递归计算的只剩下$\lfloor\frac N1\rfloor,\lfloor\frac N2\rfloor,\dots\lfloor\frac N{N^{1-c}}\rfloor$,于是复杂度变成 $$ O\left(N^c+\sum_{i=1}^{N^{1-c}}\sqrt{\left\lfloor\frac Ni\right\rfloor}\right)=O\left(N^c+\int_1^{N^{1-c}}\sqrt{\frac Nx}{\rm d}x\right)=O\left(N^c+N^{1-\frac12 c}\right) $$ 取 $c=\frac23$ 时复杂度最优,为 $O(N^{\frac23})$。 对于记忆化:可以使用 `map`,但会导致复杂度多一个 $\log$。 更好的做法是,由于递归调用的 $n$ 总是某个 $\lfloor\frac Nx\rfloor$,并且 $x>n^{\frac13}$ 的时候都会直接查预处理的表,所以可以直接记 `Ans[x]` 表示 $\lfloor\frac Nx\rfloor$ 的答案。详细代码例题中会给出。 对于计算 $\sum_{i=1}^n({\bf f*g})(i)$,由于后面还有 $O(\sqrt n)$ 的递归复杂度,所以这个东西只要在 $O(\sqrt n)$ 时间算完就不影响杜教筛复杂度;或者因为 $n$ 都是 $\lfloor\frac Nx\rfloor$,所以这个也可以套一层杜教筛。$\sum_{i=1}^n{\bf g}(i)$ 也类似,因为要计算的 $n$ 都是某个 $\lfloor\frac Nx\rfloor$,所以这个 $\bf g$ 的前缀和也可以再套一层杜教筛qaq。 ## 2.例题 ### 1.[P4213 【模板】杜教筛(Sum)](https://www.luogu.org/problemnew/show/P4213) #### Description 给定 $n\leq 2^{31}-1$,求:${\bf S}_{\varphi}(n)=\sum_{i=1}^n\varphi(n)$,以及 ${\bf S}_{\mu}(n)=\sum_{i=1}^n\mu(n)$。 ### Solution 首先两个答案一定在 `long long` 和 `int` 范围内,因为 $0\leq\varphi(n)\leq n,-1\leq\mu(n)\leq1$。 杜教筛的难点在于,给定一个 ${\bf f}(n)$,要找一个合适的函数 ${\bf g}(n)$ 使 ${\bf g},{\bf f*g}$ 的前缀和都可以快速计算。 对于 $\varphi(n)$,我们知道 $\varphi=\mu*{\bf id},\varphi*{\bf 1}={\bf id}$。所以选取 ${\bf g}(n)=1$ 即可,此时 $({\bf f*g})(n)=n$,很容易求和。 对于 $\mu(n)$,选取 ${\bf g}(n)=1$ 也可,此时 $({\bf f*g})=\epsilon(n)=[n=1]$,也很容易求和。 #### Code 下面给出求 ${\bf S}_\varphi$ 的代码: ```cpp typedef long long LL; const int maxn = 2147483647; const int maxm = 2000000; LL S1[maxm], S2[1300]; bool vis[1300]; int N; LL S(int n) { if (n < maxm) return S1[n]; int x = N / n; // 如果存在某个 x 使得 n = floor(N / x), // 选 x = floor(N / n) 一定可以。 if (vis[x]) return S2[x]; vis[x] = true; LL &ans = S2[x]; ans = (LL)n * (n + 1) / 2; // 对 (f*g)(n) = n 求和 for (int i = 2, j; i <= n; i = j + 1) { j = n / (n / i); ans -= (j - i + 1) * S(n / i); } return ans; } ``` 代码中 `maxn, maxm, 1300` 分别是 $N,N^{\frac23},N^{\frac13}$ 的最大值,`S1[i]` 在执行之前应预处理,是当 $n\leq N^{\frac23}$ 时的 ${\bf S}_\varphi(n)$。`S2[x],vis[x]` 用来记忆化 ${\bf S}_\varphi(\lfloor\frac Nx\rfloor)$。 至于代码中的第一句注释,则是因为 $\lfloor\frac Nn\rfloor$ 是使得 $xn\leq N\iff\lfloor\frac Nx\rfloor\geq n$ 的最大正整数 $x$ 。如果这个 $x$ 还不满足 $\lfloor\frac Nx\rfloor=n$ 的话,就不可能存在其他 $x$ 了。 ### 2. [P3768 简单的数学题](https://www.luogu.org/problemnew/show/P3768) #### Description 给定 $n$,求 $$\sum_{i=1}^n\sum_{j=1}^n(ij\gcd(i,j))$$ 对 $p$ 取模。$n,m\leq10^{10},5\times10^8\leq p\leq1.1\times10^9$ 且 $p$ 是质数。时限 6s。 #### Solution 首先有 $$\begin{aligned}&\sum_{i=1}^n\sum_{j=1}^n(ij\gcd(i,j))\\=&\sum_{i=1}^n\sum_{j=1}^n\left(ij\sum_{d\mid i,d\mid j}\varphi(d)\right)\\=&\sum_{d=1}^{n}\varphi(d)\left(\sum_{1\leq i\leq n,d\mid i}i\right)\left(\sum_{1\leq j\leq n,d\mid j}j\right)\\=&\sum_{d=1}^{n}d^2\varphi(d)S\left(\left\lfloor\frac nd\right\rfloor\right)^2\end{aligned}$$ 式中 $S(k)=\sum_{i=1}^k i=\frac{k(k+1)}2$。第一步等式是因为 $\sum_{d\mid k}\varphi(d)=k$。第二步等式是交换了求和顺序,把对 $d$ 的求和放到最外层。第三步等式是把两个括号里的公因数 $d$ 提出来。 根据老套路,我们数论分块,并对每一块的 $d^2\varphi(d)$ 求区间和。 考虑使用杜教筛计算两个区间和相减。但是一个问题是时间复杂度。 假设我们已经有了函数 `LL S(LL n)` 用来求 $d^2\varphi(d)$ 的前缀和,那么接下来应该这样: ```cpp for (int i = 1, j; i <= n && i <= m; i = j + 1) { j = n / (n / i); LL t = Sum(n / i); ans = (ans + (S(j) - S(i - 1)) * t % p * t % p) % p; } ``` 可以发现 `j` 始终是某个 $\lfloor\frac nx\rfloor$ ,而 `i-1` 就是上一次的 `j` ,自然也是某个 $\lfloor\frac nx\rfloor$ 。从而恰好用到了杜教筛所有的递归计算,仍然只有 $O(n^{\frac23})$ 的复杂度。 第二个问题是对于 ${\bf f}(n)=n^2\varphi(n)$,如何找到合适的 ${\bf g}$。 考虑在数论函数的狄利克雷卷积之外定义点乘 ${\bf f\cdot g}$,指逐项相乘,即 $({\bf f\cdot g})(n)={\bf f}(n){\bf g}(n)$;定义函数 ${\bf f}(n)$ 是完全积性函数,当且仅当对于所有的 $n,m$ 都有 ${\bf f}(nm)={\bf f}(n){\bf f}(m)$。像 $\epsilon(n)=[n=1],{\bf id}^k(n)=n^k$ 都在此列。 #### 引理 2.1 > 若 ${\bf f}$ 是完全积性函数,${\bf g, h}$ 是数论函数,则 $({\bf f\cdot g})*({\bf f\cdot h})={\bf f}\cdot({\bf g*h})$。 证明是很显然的: $$\begin{aligned}&\left(({\bf f\cdot g})*({\bf f\cdot h})\right)(n)\\=&\sum_{d\mid n}{\bf f}(d){\bf g}(d){\bf f}\left(\frac nd\right){\bf h}\left(\frac nd\right)\\=&{\bf f}(n)\sum_{d\mid n}{\bf g}(d){\bf h}\left(\frac nd\right)\\=&\left({\bf f}\cdot({\bf g*h})\right)(n)\end{aligned}$$ 由此,对于 ${\bf f}(n)=n^2\varphi(n)$,即 ${\bf f}={\bf id}^2\cdot\varphi$,可取 ${\bf g}={\bf id}^2\cdot{\bf 1}$,则根据上述引理有 ${\bf f*g}={\bf id}^2\cdot(\varphi*{\bf 1})$,即 ${\bf f*g}={\bf id}^3$。 所以令 ${\bf g}(n)=n^2\cdot1=n^2$,则立得 $${\bf S}(n)=\sum_{i=1}^ni^3-\sum_{i=2}^ni^2{\bf S}\left(\left\lfloor\frac ni\right\rfloor\right)$$ 至于如何对 $i^2,i^3$ 求和,我们有 $\sum_{i=1}^ni^3=\frac{n^2(n+1)^2}4$,$\sum_{i=1}^ni^2=\frac{n(n+1)(2n+1)}6$。 具体代码作为练习(雾),其实和上面的 $\varphi(n)$ 的杜教筛是类似的。 ### 3. BZOJ4176 Lucas的数论 这是权限题。 #### Description 给定 $n$,求 $\sum_{i=1}^n\sum_{j=1}^n{\bf d}(ij)$。${\bf d}(k)$ 是 $k$ 的约数个数。 $n\leq10^9$。简化版是[[SDOI2015]约数个数和](https://www.luogu.org/problemnew/show/P3327)。 #### Solution 对于 ${\bf d}(ij)$,考虑某个 $d\mid ij$ 来说,令 $a=\frac i{\gcd(i,d)},b=\frac d{\gcd(i,d)}$,显然 $a\perp b,a\mid i,b\mid j$ (前两个显然,最后一个是因为$b\gcd(i,d)\mid ij\Rightarrow b\mid aj\Rightarrow b\mid j$ 。最后一步是因为 $a\perp b$ )。另外,任意给定两个数 $a,b$ 使得 $a\perp b,a\mid i,b\mid j$ 都有 $d=\frac iab\mid ij$ ,且 $\frac i{\gcd(i,d)}=a,\frac d{\gcd(i,d)}=b$。 由此可知 $$\sum_{d\mid ij}1=\sum_{a\mid i,b\mid j,a\perp b}1=\sum_{a\mid i,b\mid j}[a\perp b]$$ 所以 $$\begin{aligned}ans=&\sum_{i=1}^n\sum_{j=1}^n{\bf d}(ij)\\=&\sum_{i=1}^n\sum_{j=1}^n\sum_{a\mid i}\sum_{b\mid j}[a\perp b]\\=&\sum_{i=1}^n\sum_{j=1}^n\sum_{a\mid i}\sum_{b\mid j}\sum_{d\mid a,d\mid b}\mu(d)\\=&\sum_{d=1}^n\mu(d)\left(\sum_{d\mid a}\sum_{a\mid i\leq n}1\right)\left(\sum_{d\mid b}\sum_{b\mid j\leq n}1\right)\\=&\sum_{d=1}^n\mu(d)\left(\sum_{a=1}^{\lfloor\frac nd\rfloor}\left\lfloor\frac {\lfloor\frac nd\rfloor}a\right\rfloor\right)^2\end{aligned}$$ 令 $F(n)=\sum_{i=1}^n\left\lfloor\frac ni\right\rfloor=\sum_{i=1}^n\sum_{ij\leq n}1=\sum_{t=1}^n{\bf d}(t)$, $$ans=\sum_{d=1}^n\mu(d)F\left(\left\lfloor\frac nd\right\rfloor\right)^2$$ 对 $d$ 数论分块,则需要快速求出 $\mu(d)$ 的前缀和与 $F\left(\left\lfloor\frac nd\right\rfloor\right)$。前者可以直接杜教筛;后者可以借鉴杜教筛的思想。 考虑到单次计算 $F(n)$ 复杂度为 $O(\sqrt n)$(数论分块),而预处理 $F(1)\dots F(n)$ 复杂度是 $O(n)$(因为可以线性筛出 ${\bf d}$,则可以预处理出 $F(1)\dots F(n^{\frac23})$,后面的 $F$ 依次 $O(\sqrt n)$ 算,复杂度仍然是 $O(n^{\frac23})$。 虽然实际上这道题不预处理的话 $O(n^{\frac34})$ 也能过,但是无所谓了qaq。 ### 4. 奇怪的题目 #### Description 给定 $n$ ,求 $\sum_{i=1}^n(\mu^2*({\bf id}\cdot\mu))(i)$。 其中 $n\leq10^9$,$\mu^2(n)=(\mu(n))^2$。 #### Solution 令 ${\bf f}=\mu^2*({\bf id}\cdot\mu)$,则 ${\bf id}*f=({\bf id}*({\bf id}\cdot\mu))*\mu^2=\mu^2$。所以取 ${\bf g}(n)=n$,因此 $${\bf S}(n)=\sum_{i=1}^n\mu^2(i)-\sum_{i=2}^ni{\bf S}\left(\left\lfloor\frac ni\right\rfloor\right)$$ 剩下的就是如何计算 $\sum_{i=1}^n\mu^2(i)$。 可以发现 $\mu^2(i)=[i\text{不含平方因子}]$。所以定义 ${\bf s}(i)=\max_{d^2\mid i}d$,则 $\mu^2(i)=[{\bf s}(i)=1]$。 容易发现 $d^2\mid i\iff d\mid{\bf s}(i)$, 所以 $$\sum_{i=1}^n\mu^2(i)=\sum_{i=1}^n[{\bf s}(i)=1]=\sum_{i=1}^n\sum_{d^2\mid i}\mu(d)=\sum_{d=1}^{\lfloor\sqrt n\rfloor}\mu(d)\left\lfloor\frac n{d^2}\right\rfloor$$ 可以暴力枚举 $d$,在 $O(\sqrt n)$ 时间内求出。由于杜教筛本来就有 $O(\sqrt n)$ 的计算,这并不会增加复杂度。 ## 3.贝尔级数 有的时候我们不太容易找到杜教筛的合适的 ${\bf g}$,这时候有一个很厉害的东西:贝尔级数。 (Warning: 以下要求大致了解生成函数相关) ### 3.1 定义 对于积性函数 ${\bf f}(n)$ ,定义 ${\bf f}$ 模 $p$ 的贝尔级数为 $${\bf f}_p(x)=\sum_{i=0}^{\infty}{\bf f}(p^i)x^i$$ 例如 $\epsilon_p(x)=1,{\bf 1}_p(x)=\frac1{1-x},{\bf id}^k_p(x)=\frac1{1-p^kx},\mu_p(x)=1-x,{\bf d}_p(x)=\frac1{(1-x)^2},\varphi_p(x)=\frac{1-x}{1-px}$。 一个很好的性质是(实际上就是把狄利克雷卷积变成了一般卷积) $$ ({\bf f*g})_p(x)={\bf f}_p(x){\bf g}_p(x) $$ 接下来我们就要生拼硬凑出一些奇怪的例题了: ### 3.2 例题 令积性函数 ${\bf f}$ 满足 ${\bf f}(p^c)=p^c+[c>0](-1)^c$,求 ${\bf f}$ 的前缀和。 可以发现 ${\bf f}_p(x)=-1+\sum_{i=0}^{\infty}\left(p^ix^i+(-1)^ix^i\right)=\frac1{1-px}+\frac1{1+x}-1$, 所以取 ${\bf g}_p(x)=(1-px)(1+x)$,即得 $$({\bf f*g})_p(x)=1+x+1-px-(1-px)(1+x)=1+px^2$$ 所以问题转化成了如何求 ${\bf g}$ 的前缀和,以及如何求 ${\bf h}_p(x)=1+px^2$ 的前缀和。 显然可知 $(1-px)$ 对应 ${\bf id}\cdot\mu$,而 $(1+x)$ 对应 $\mu^2$。(指 $\mu^2(n)=(\mu(n))^2=|\mu(n)|$)。 所以 ${\bf g}=({\bf id}\cdot\mu)*\mu^2$,其前缀和可以通过之前的那道“奇怪的题目”的做法求出。 而对于 ${\bf h}(n)$ 的前缀和,可以发现只有 $n$ 是完全平方数,且每个质因数的指数都是 2 (等价于 $\mu(\sqrt n)\neq0$)时 ${\bf h}(n)=\sqrt n$,其他时候 ${\bf h}(n)=0$。所以很显然的, $$\sum_{i=1}^n{\bf h}(i)=\sum_{i=1}^{\lfloor\sqrt n\rfloor}i\mu^2(i)$$ 枚举 $i$ 即可在 $O(\sqrt n)$ 时间内算出。所以本题解决了,复杂度是 $O(n^{\frac23})$。 ## 4.总结 ~~本篇文章,是一位在 OI 中数学方面小有名气的选手无私的馈赠。五道杜教筛例题,涵盖了杜教筛从入门到进阶的大部分套路。你可以通过这篇文章,对杜教筛进行较为深入的了解。详细的复杂度证明、精心挑选的例题和各种不同的套路与 trick,能让你对杜教筛有一个较为全面的掌握。作者相信,这篇漂亮的博客,可以给拼搏于 OI 的逐梦之路上的你,提供一个有力的援助。~~ 本文在读者已经掌握莫比乌斯反演的基础上讲述了杜教筛,并提出了若干例题,涵盖了部分杜教筛题目的套路;既可以作为杜教筛的入门文章,又可以让部分选手更进一步地了解杜教筛,更是一篇不错的杜教筛复习博客。