筛法
数论分块
用于处理 \(\sum\limits_{i=1}^n\left\lfloor\frac{n}{i}\right\rfloor\) 类型的和式。
常规做法是 \(O(n)\) 的。我们发现,\(\left\lfloor\frac{n}{i}\right\rfloor\) 有很多取值是相等的,考虑使用这点来优化。
重要的性质
\(\left\lfloor\frac{n}{i}\right\rfloor\) 的不同的取值只有 \(O(\sqrt n)\) 种。
证明:
对于 \(i\in[1,\sqrt n]\),取值最多 \(\sqrt n\) 个;对于 \(i\in[\sqrt n,n]\),\(\left\lfloor\frac{n}{i}\right\rfloor\le\sqrt n\),取值最多 \(\sqrt n\) 个。
于是我们可以枚举每一个 \(\left\lfloor\frac{n}{i}\right\rfloor\) 取值相等的段计算,降低复杂度。
现在的问题是,我们需要对于一个 \(i\) ,求出满足 \(\left\lfloor\frac{n}{j}\right\rfloor=\left\lfloor\frac{n}{i}\right\rfloor\) 的最大的 \(j\) 是多少,根据数学推导,容易得出 \(j=\left\lfloor\frac{n}{\left\lfloor\frac{n}{i}\right\rfloor}\right\rfloor\)。
于是我们在 \(O(\sqrt n)\) 的复杂度内解决了问题。
杜教筛
对于数论函数 \(f\),杜教筛可以在低于线性时间的复杂度内计算 \(S(n)=\sum\limits_{i=1}^nf(i)\)。
我们找一个积性函数 \(g\),考虑其与 \(f\) 的狄利克雷卷积:
\(\begin{aligned}\sum\limits_{i=1}^n(f\ast g)(i)&=\sum\limits_{i=1}^n\sum\limits_{d\mid i}g(d)f\left(\frac{i}{d}\right)\\&=\sum\limits_{d=1}^ng(d)\sum\limits_{i=1}^{\left\lfloor\frac{n}{d}\right\rfloor}f(i)\\&=\sum\limits_{d=1}^ng(d)S\left(\left\lfloor\frac{n}{d}\right\rfloor\right)\end{aligned}\)
\(S(n)=g(1)S(n)\) 可以写成:\(\sum\limits_{i=1}^ng(i)S\left(\left\lfloor\frac{n}{i}\right\rfloor\right)-\sum\limits_{i=2}^ng(i)S\left(\left\lfloor\frac{n}{i}\right\rfloor\right)\),即:
令 \(f\ast g=h\),则:
如果 \(h\) 的前缀和是好求的,\(g\) 的前缀和也是好求的,那么使用数论分块就可以递归快速求出 \(S(n)\)。
时间复杂度
若计算 \(h\) 和 \(g\) 的前缀和的时间复杂度均为 \(O(1)\),则杜教筛复杂度为 \(O(n^{\frac{3}{4}})\)。
还可以优化:我们预处理出一部分 \(S(1)\sim S(m)\) 再计算。取 \(m=n^{\frac{2}{3}}\) 时,复杂度为 \(O(n^{\frac{2}{3}})\)。
筛 \(\mu\)
因为 \(\mu\ast\mathbf{1}=\epsilon\),带入式子得:
即:
\(\mathbf{1}(i)\) 的前缀和就是 \(i\),杜教筛即可。
筛 \(\varphi\)
因为 \(\varphi\ast\mathbf{1}=\operatorname{id}\),带入式子得:
即:
\(\mathbf{1}(i)\) 的前缀和是 \(i\),同样杜教筛即可。
Powerful Number 筛
定义:对于正整数 \(n\),记 \(n\) 的质因数分解为 \(n=\prod\limits_{i=1}^mp_i^{e_i}\)。\(n\) 是 Powerful Number(简称 PN)当且仅当 \(\forall 1\le i\le m,e_i>1\)。
PN 的性质
- 所有 PN 都可以表示成 \(a^2b^3\) 的形式。
证明:
若 \(e^i\) 是偶数,则将 \(p_i^{e_i}\) 合并进 \(a^2\) 里;若 \(e_i\) 为奇数,则先将 \(p_i^3\) 合并进 \(b^3\) 里,再将 \(p_i^{e_i−3}\) 合并进 \(a^2\) 里。
- \(n\) 以内的 PN 有 \(O(\sqrt n)\) 个。
证明:
考虑枚举 \(a\),再考虑满足条件的 \(b\) 的个数,有 PN 的个数约等于:
PN 的求法
实际上很简单。线性筛找出 \(\sqrt n\) 内的所有素数,再 DFS 搜索各素数的指数即可。
由于 \(n\) 以内的 PN 至多有 \(O(\sqrt n)\) 个,所以至多搜索 \(O(\sqrt n)\) 次。
PN 筛
假设现在要求积性函数 \(f\) 的前缀和 \(F(n)=\sum\limits_{i=1}^nf(i)\)。
我们构造出一个易求前缀和的积性函数 \(g\),且对于任意素数 \(p\),有 \(g(p)=f(p)\)。记 \(G(n)=\sum\limits_{i=1}^ng(i)\)。
接着,构造函数 \(h\) 使得 \(f=g\ast h\)。根据狄利克雷卷积的性质可知 \(h\) 也为积性函数,因此 \(h(1)=1\)。
对于素数 \(p\),有 \(f(p)=g(1)h(p)+g(p)h(1)=h(p)+g(p)\),于是可知 \(h(p)=0\)。又因为 \(h\) 是积性函数,所以对于任意非 PN 的数 \(n\) 有 \(h(n)=0\),即 \(h\) 仅在 PN 处取有效值。
现在,根据 \(f=g\ast h\) 有:
\(\begin{aligned}F(n)&=\sum\limits_{i=1}^nf(i)\\&=\sum\limits_{i=1}^n\sum\limits_{d\mid i}h(d)g\left(\frac{i}{d}\right)\\&=\sum\limits_{d=1}^n\sum\limits_{i=1}^{\left\lfloor\frac{n}{d}\right\rfloor}h(d)g(i)\\&=\sum\limits_{d=1}^nh(d)G\left(\left\lfloor\frac{n}{d}\right\rfloor\right)\\&=\sum\limits_{d=1\land d\in \operatorname{PN}}^nh(d)G\left(\left\lfloor\frac{n}{d}\right\rfloor\right)\end{aligned}\)
\(O(\sqrt n)\) 找出所有 PN,计算出所有 \(h\) 的有效值。对于 \(h\) 有效值的计算,只需要计算出所有 \(h(p^c)\) 处的值,就可以根据 \(h\) 为积性函数推出 \(h\) 的所有有效值。
考虑计算 \(h(p^c)\),两种方法:
-
推出 \(h(p^c)\) 仅与 \(p,c\) 有关的公式,直接计算。
-
根据 \(f=g\ast h\) 有 \(f(p^c)=\sum\limits_{i=0}^c g(p^i)h(p^{c−i})\),移项得 \(h(p^c)=f(p^c)-\sum\limits_{i=1}^cg(p^i)h(p^{c−i})\),枚举素数 \(p\) 和指数 \(c\) 即可求出所有 \(h(p^c)\)。
总复杂度 \(O(n\log n)\)。
例题
- Crash 的数字表格
\(T\) 组数据,给定 \(n,m\),求:
sol:
不妨设 \(n\le m\),则:
\(\begin{aligned}\sum\limits_{i=1}^n\sum\limits_{j=1}^m\operatorname{lcm}(i,j)&=\sum\limits_{i=1}^n\sum\limits_{j=1}^m\frac{ij}{\gcd(i,j)}\\&=\sum\limits_{d=1}^n\sum\limits_{i=1}^n\sum\limits_{j=1}^m\frac{ij}{d}[\gcd(i,j)=d]\\&=\sum\limits_{d=1}^nd\sum\limits_{i=1}^{\lfloor \frac{n}{d}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{m}{d}\rfloor}ij[\gcd(i,j)=1]\\&=\sum\limits_{d=1}^nd\sum\limits_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{m}{d}\rfloor}ij\sum\limits_{x\mid\gcd(i,j)}\mu(x)\\&=\sum\limits_{d=1}^{n}d\sum\limits_{x=1}^{\lfloor\frac{n}{d}\rfloor}\mu(x)\sum\limits_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{m}{d}\rfloor}ij[x\mid \gcd(i,j)]\\&=\sum\limits_{d=1}^{n}d\sum\limits_{x=1}^{\lfloor\frac{n}{d}\rfloor}\mu(x)\sum\limits_{i=1}^{\lfloor\frac{n}{dx}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{m}{dx}\rfloor}x^2ij\\&=\sum\limits_{d=1}^n\sum\limits_{x=1}^{\lfloor\frac{n}{d}\rfloor}dx^2\mu(x)\sum\limits_{i=1}^{\lfloor\frac{n}{dx}\rfloor}i\sum\limits_{j=1}^{\lfloor\frac{m}{dx}\rfloor}j\end{aligned}\)
令 \(t=dx\),则原式 \(=\sum\limits_{t=1}^n\sum\limits_{i=1}^{\lfloor\frac{n}{t}\rfloor}i\sum\limits_{j=1}^{\lfloor\frac{m}{t}\rfloor}j\sum\limits_{dx=t}dx^2\mu(x)\)。
即是:
可以发现,\(t\sum\limits_{x\mid t}x\mu(x)\) 为积性函数,可以线性筛预处理前缀和,而前面一部分使用数论分块处理即可。
- 简单的数学题
给定 \(n\),求:
sol:
使用 \(\sum\limits_{d\mid n}\varphi(d)=n\)。
\(\begin{aligned}\sum\limits_{i=1}^n\sum\limits_{j=1}^nij\gcd(i,j)&=\sum\limits_{i=1}^n\sum\limits_{j=1}^nij\sum\limits_{x\mid i,x\mid j}\varphi(x)\\&=\sum\limits_{x=1}^n\varphi(x)\sum\limits_{i=1}^ni[x|i]\sum\limits_{j=1}^nj[x|j]\\&=\sum\limits_{x=1}^n\varphi(x)\sum\limits_{i=1}^{\left\lfloor\frac{n}{x}\right\rfloor}ix\sum\limits_{j=1}^{\left\lfloor\frac{n}{x}\right\rfloor}jx\\&=\sum\limits_{x=1}^n\varphi(x)x^2\left(\sum\limits_{i=1}^{\left\lfloor\frac{n}{x}\right\rfloor}i\right)^2\end{aligned}\)
后面可以数论分块解决,现在需要快速求出 \(\varphi(i)i^2\) 的前缀和。
考虑杜教筛,令 \(f=\varphi\cdot\operatorname{id}^2\),需要找出合适的 \(g\)。
为了 \((f\ast g)\) 求前缀和方便,由于 \(i\cdot\frac{n}{i}=n\),取 \(g=\operatorname{id}^2\),以消掉 \(i\)。
带到式子里:
\(\begin{aligned}g(1)S(n)&=\sum\limits_{i=1}^n(f\ast g)(i)-\sum\limits_{i=2}^n\operatorname{id}^2(i)S\left(\left\lfloor\frac{n}{i}\right\rfloor\right)\\&=\sum\limits_{i=1}^nn^3-\sum\limits_{i=2}^nn^2S\left(\left\lfloor\frac{n}{i}\right\rfloor\right)\end{aligned}\)
显然,\(n^3\) 与 \(n^2\) 的前缀和都可以 \(O(1)\) 求,于是问题解决。
- Min_25 筛
给定积性函数 \(f\),其在质数的幂次的取值为 \(f(p^k)=p^k(p^k-1)\),求 \(\sum\limits_{i=1}^nf(i)\)。
sol:
这里使用 PN 筛完成此题。
易得 \(f(p)=p(p−1)=\operatorname{id}(p)\cdot\varphi(p)\),构造 \(g(n)=\operatorname{id}(n)\cdot\varphi(n)\)。
我们可以使用杜教筛求 \(g\) 的前缀和。具体来说,构造 \(f=\operatorname{id}\),则 \(f\ast g=\operatorname{id}^2\)。
之后计算 \(h(p^k)\) 的取值:
-
可以直接枚举,这种方法略去。
-
此题还能直接求出 \(h(p^k)\) 的公式:\(h(p^k)=(k-1)(p-1)p^k\)。带入计算即可。

浙公网安备 33010602011771号