Java教程

Min_25 Sieve 学习笔记

本文主要是介绍Min_25 Sieve 学习笔记,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

这个东西不是人想的。

解决问题:积性函数前缀和。

适用条件:可以快速计算 \(f(p)\) 的前缀和,\(f(p^k)\) 可以被表示成若干完全积性函数的线性组合(指对应项可以快速组合出来)。

时空复杂度:就当是 \(O(\dfrac{n^\frac{3}{4}}{\log n}+n^{1-\epsilon})-O(\sqrt n)\)。

以下默认 \(f(p)\) 为关于 \(p\) 的单项式,\(p_i\) 为第 \(i\) 个质数。

求质数处的前缀和

我们需要对于每个能被表示成 $\lfloor \dfrac{n}{x}\rfloor $ 的数,求所有在其前的质数 \(p\) 的 \(\sum f(p)\)。注意到一个数的最小质因子小等于 \(\sqrt n\),我们设计一个 dp:\(g_{i,j}\) 表示最小质因子大于 \(p_i\),\([1,j]\) 的所有数的 \(f\) 之和。转移时把最小质因子为 的 \(p_i\) 数的 \(f\) 全部删去,即得转移,注意容斥掉前面的质数的贡献:

\[g_{i,j} = g_{i-1,j} - f(p_i)\big{(}g_{i-1,j/p_i} - \sum_{k\le i}f(p_k)\big{)} \]

这就体现出完全积性的重要性。求和号部分可以在线筛质数的时候预处理出来。第一维显然可以滚动数组优化掉,而对于第二维,$\lfloor \dfrac{n}{x}\rfloor $ 只有 \(O(\sqrt n)\) 个,预处理出来,大于 \(\sqrt n\) 的编号为 \(n/\sqrt n\) 即可。

我们把筛去所有最小质因子后的得到的 dp 数组记为 \(g\)。

求原函数前缀和

设 \(s_{n,i}\) 表示 \([1,n]\) 最小质因子大于 \(p_i\) 的所有数的 \(f\) 之和。枚举最小质因子及其次数,得到转移

\[s_{n,i} = g_n - \sum_{j\le i}f(p_j) + \sum\limits_{p_k^t \le n} f(p_k^t)\bigg{(}s_{n/p_k^t},k+1)+[t\gt 1]\bigg{)} \]

根据神奇的复杂度分析,可以直接递归下去做。

最后加上 \(1\) 的贡献。

这篇关于Min_25 Sieve 学习笔记的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!