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)\) ,满足以下性质:
- \(\forall \boldsymbol f'_k\) 为完全积性函数
- \(\sum\boldsymbol f'_k(p)=\boldsymbol f(p)\)
- \(\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})\)