筛法

数论分块

用于处理 \(\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)\),即:

\[\sum\limits_{i=1}^n(f\ast g)(i)-\sum\limits_{i=2}^ng(i)S\left(\left\lfloor\frac{n}{i}\right\rfloor\right) \]

\(f\ast g=h\),则:

\[g(1)S(n)=\sum\limits_{i=1}^nh(i)-\sum\limits_{i=2}^ng(i)S\left(\left\lfloor\frac{n}{i}\right\rfloor\right) \]

如果 \(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}(1)S(n)=\sum_{i=1}^n\epsilon(i)-\sum_{i=2}^n\mathbf{1}(i)S\left(\left\lfloor\frac{n}{i}\right\rfloor\right) \]

即:

\[S(n)=1-\sum_{i=2}^n\mathbf{1}(i)S\left(\left\lfloor\frac{n}{i}\right\rfloor\right) \]

\(\mathbf{1}(i)\) 的前缀和就是 \(i\),杜教筛即可。

\(\varphi\)

因为 \(\varphi\ast\mathbf{1}=\operatorname{id}\),带入式子得:

\[\mathbf{1}(1)S(n)=\sum_{i=1}^n\operatorname{id}(i)-\sum_{i=2}^n\mathbf{1}(i)S\left(\left\lfloor\frac{n}{i}\right\rfloor\right) \]

即:

\[S(n)=\frac{n(n+1)}{2}-\sum_{i=2}^n\mathbf{1}(i)S\left(\left\lfloor\frac{n}{i}\right\rfloor\right) \]

\(\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 的性质

  1. 所有 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\) 里。

  1. \(n\) 以内的 PN 有 \(O(\sqrt n)\) 个。

证明:

考虑枚举 \(a\),再考虑满足条件的 \(b\) 的个数,有 PN 的个数约等于:

\[\int_1^{\sqrt n}\sqrt[3]{\frac{n}{x^2}}\mathbf{d}x=O(\sqrt n) \]

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)\)

例题

  1. Crash 的数字表格

\(T\) 组数据,给定 \(n,m\),求:

\[\sum\limits_{i=1}^n\sum\limits_{j=1}^m\operatorname{lcm}(i,j) \]

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)\)

即是:

\[\sum\limits_{t=1}^n\sum\limits_{i=1}^{\lfloor\frac{n}{t}\rfloor}i\sum\limits_{j=1}^{\lfloor\frac{m}{t}\rfloor}jt\sum\limits_{x\mid t}x\mu(x) \]

可以发现,\(t\sum\limits_{x\mid t}x\mu(x)\) 为积性函数,可以线性筛预处理前缀和,而前面一部分使用数论分块处理即可。

  1. 简单的数学题

给定 \(n\),求:

\[\sum\limits_{i=1}^n\sum\limits_{j=1}^nij\gcd(i,j) \]

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\)

\[(f\ast g)(n)=\sum\limits_{d\mid n}\varphi(d)d^2\cdot\left(\frac{n}{d}\right)^2=n^2\sum\limits_{d\mid n}\varphi(d)=n^3 \]

带到式子里:

\(\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)\) 求,于是问题解决。

  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\)。带入计算即可。

posted @ 2025-02-08 17:17  O_v_O  阅读(9)  评论(0)    收藏  举报