min_25筛

目录

目录地址

上一篇

下一篇


min_25 筛思想

min_25 筛将求积性函数的前缀和分为质数的贡献和非质数的贡献,最后求和。

这样,我们可以通过先求出质数的贡献,再利用质数贡献反算出合数的贡献,从而快速求和

要让 min_25 筛实现,只需要积性函数 \(\boldsymbol f\) 在质数的整数次方出能快速计算即可


min_25 筛的质数贡献

考虑 \(\displaystyle ans=\sum_{i=1}^n\boldsymbol f(i)\)

我们现在设几个新的函数 \(\boldsymbol f'_k(n)\) ,满足以下性质:

  1. \(\forall \boldsymbol f'_k\) 为完全积性函数
  2. \(\sum\boldsymbol f'_k(p)=\boldsymbol f(p)\)
  3. \(\forall \boldsymbol f'_k\) 可快速求和

那么,由于 \(\displaystyle \sum_{i=1}^n[i\in Prime]\boldsymbol f(i)=\sum_{i=1}^n[i\in Prime](\sum \boldsymbol f'_k)(i)=\sum\ \sum_{i=1}^n[i\in Prime]\boldsymbol f'_k(i)\)

因此,我们的问题转化为了求解 \(\displaystyle \sum_{i=2}^n[i\in Prime]\boldsymbol f'_k(i)\)

我们记 \(\displaystyle g(n,j)=\sum_{i=2}^n[i\in Prime\vee fc_i>p_j]\boldsymbol f'_k(i)\)

其中 \(Prime\)\([1,n]\) 中的质数集合, \(p_j\)\(Prime\) 内第 \(j\) 小的数(即第 \(j\) 个质数), \(fc_i\)\(i\) 的最小质因数

因此 \(g(n,j)\) 表示的是,质数和最小质因数大于 \(p_j\) 的数的贡献

很显然,我们要求的 \(\displaystyle \sum_{i=2}^n[i\in Prime]\boldsymbol f'_k(i)=g(n,Card(Prime)\ )\)

\(Card(A)\) 表示集合 \(A\) 的元素数量

而初始状态,则为 \(\displaystyle g(n,0)=\sum_{i=2}^n[i\in Prime\vee fc_i>p_0]\boldsymbol f'_k(i)=\sum_{i=2}^n\boldsymbol f'_k(i)=\sum_{i=1}^n\boldsymbol f'_k(i)-\boldsymbol f'_k(1)=\sum_{i=1}^n\boldsymbol f'_k(i)-1\)

由于 \(\boldsymbol f'_k\) 的前缀和能快速求解,所以 \(g(n,0)\) 是能快速求解的

接下来我们考虑怎么从 \(g(n,0)\) 递推至 \(g(n,Card(Prime)\ )\)

当从 \(g(n,m-1)\) 递推至 \(g(n,m)\) 时,我们需要删去最小质因数为 \(p_m\) 的合数的贡献

首先,当 \(p_m>\sqrt n\) 时,一定是没有任何合数满足最小质因数为 \(p_m\) 这一条件的

因此 \(g(n,m)=g(n,m-1)\)

对于剩余的情况,我们是要删去最小质因数为 \(p_m\) 的合数

而对于所有最小质因数为 \(p_m\) 的合数,一定是 \(p_m\) 乘上一个最小质因数大于 \(p_{m-1}\) 的数(注意,这边质数也是符合条件的)

所以这些 \(fc_i=p_m\) 的合数的 \(\boldsymbol f'_k\) 值,一定可以写成 \(\displaystyle \sum_{i=2}^{p_m\cdot i\leq n}\boldsymbol f'_k(p_m\cdot i)[fc_i>p_{m-1}]\)

由于 \(\boldsymbol f'_k\) 为完全积性函数,所以我们可以把这个展开 \(\displaystyle \sum_{i=2}^{i\leq n/p_m}\boldsymbol f'_k(p_m)\cdot \boldsymbol f'_k(i)[fc_i>p_{m-1}]=\boldsymbol f'_k(p_m)\cdot \sum_{i=2}^{n/p_m}[fc_i>p_{m-1}]\boldsymbol f'_k(i)\)

我们这边用一个很巧妙的转化: \(\displaystyle \sum_{i=2}^{n/p_m}[fc_i>p_{m-1}]\boldsymbol f'_k(i)=\sum_{i=2}^{n/p_m}[fc_i>p_{m-1}\vee i\in Prime]\boldsymbol f'_k(i)-\sum_{i=1}^{m-1}\boldsymbol f'_k(p_i)\)

前一个求和号即为 \(g(n/p_m,m-1)\) ,后面那个求和号我们记为 \(Sp(m-1)\) ,由于 \(p_i<p_m\leq \sqrt n\) 我们可以线筛处理

因此,带回去,我们从 \(g(n,m-1)\) 转移到 \(g(n,m)\) 应该减去 \(\boldsymbol f'_k(p_m)(g(n/p_m,m-1)-Sump(m-1)\ )\)


最后我们总结一下思路:

先线筛出 \(\boldsymbol f'_k\)\(\sqrt n\) 内的函数值、质数前缀和

然后利用递推式:\(g(n,m)=\begin{cases} g(n,m-1),p_m^2> n \\\ \\ g(n,m-1)-\boldsymbol f'_k(g(n/p_m,m-1)-Sp(m-1)\ ),p_m^2\leq n \end{cases}\)

由于 \(n/d\) 的取值只有 \(2\sqrt n\) 个,我们只需要处理这 \(2\sqrt n\) 的取值即可,而且第二维还能利用滚动出去空间上的开销

于是,质数的贡献 \(\displaystyle \sum_{i=1}^n[i\in Prime]\boldsymbol f(i)\) 只需要对我们求出来的求和即可求出

这一部分的复杂度经证明为 \(O({n^{3\over 4}\over \log n})\)


min_25 筛的总贡献

接下来我们考虑如何求解我们想要的 \(\displaystyle ans=\sum_{i=1}^n\boldsymbol f(i)\)

我们设 \(\displaystyle S(n,m)=\sum_{i=2}^n[fc_i\geq p_m]\boldsymbol f(i)\)\(ans=S(n,1)+\boldsymbol f(1)=S(n,1)+1\)

而我们还是思考如何递推求得 \(S(n,1)\)

首先,对于 \(p_{m-1}^2\leq n\leq p_m^2\) ,很容易得到

\(\displaystyle S(n,m)=\sum_{i=2}^n[fc_i\geq p_m]\boldsymbol f(i)=\sum_{i=2}^n[i\in Prime\vee i\geq p_m]\boldsymbol f(i)=\sum_{i=2}^n[i\in Prime]\boldsymbol f(i)-\sum_{i=2}^{m-1}\boldsymbol f(p_i)\)

前面那个求和号我们刚刚求出来了,后面那个求和号实际上就算 \(Sump(m-1)\) ,能快速求出

考虑从 \(S(n,m+1)\) 递推至 \(S(n,m)\) 肯定会增加,增加的是最小质因数为 \(p_m\) 的贡献

\(\displaystyle \sum_{i=2}^n[fc_i=p_m]\boldsymbol f(i)\)

把它分为质数和合数考虑,如果是合数,再按质因数中含多少 \(p_m\) 处理:

当质因数中含 \(e\)\(p_m\) 的,我们考虑它的贡献为

\(\displaystyle \sum_{i=2}^n[p_m^e\mid n\wedge p_m^{e+1}\nmid n]\boldsymbol f(i)=\boldsymbol f(p_m^e)+\sum_{i=2}^{p_m^e\cdot i\leq n}[fc_i>p_m]\boldsymbol f(p_m^e\cdot i)=\boldsymbol f(p_m^e)+\sum_{i=2}^{n/p_m^e}[fc_i\geq p_{m+1}]\boldsymbol f(p_m^e)\cdot \boldsymbol f(i)=\boldsymbol f(p_m^e)+\boldsymbol f(p_m^e)\cdot \sum_{i=2}^{n/p_m^e}[fc_i\geq p_{m+1}]\boldsymbol f(i)\)

根据定义,很明显可以发现,求和号就是 \(S(n/p_m^e,m+1)\)

因此,对于质因数含有 \(e\)\(p_m\) 的,对 \(S(n,m+1)\) 递推至 \(S(n,m)\) 的贡献为 \(\boldsymbol f(p_m^e)+\boldsymbol f(p_m^e)\cdot S(n/p_m^e,m+1)\)

所以由 \(S(n,m+1)\) 递推至 \(S(n,m)\) 的贡献为 \(\displaystyle \sum_{e=1}^{p_m^e\leq n}(\boldsymbol f(p_m^e)\cdot S(n/p_m^e,m+1)+f(p_m^{e+1})\ )\)

\(\displaystyle S(n,m)=\sum_{i=2}^n[i\in Prime]\boldsymbol f(i)-Sump(m-1)+\sum_{i=j}^{p_i^2\leq n}\sum_{e=1}^{p_i^e\leq n}(\boldsymbol f(p_i^e)\cdot S(n/p_i^e,i+1)+\boldsymbol f(p_i^{e+1})\ )\)

由于第二维没办法滚动,记忆化难度较大,因此,只能递归求解

经证明,复杂度为 \(O(n^{1-\varepsilon})\)

这个复杂度是比较神奇的,其表明当 \(n\) 趋近于无穷大的时候,复杂度会无限接近于 \(O(n)\)

但这并不表明它是 \(O(n)\) 的,事实上,好像绝大部分情况下都跑得比洲阁筛更快

因此,min_25 筛的总复杂度为 \(O({n^{3\over 4}\over \log n}+n^{1-\varepsilon})\)

posted @ 2020-03-19 09:09  JustinRochester  阅读(373)  评论(0编辑  收藏  举报