Min_25
首先是来自某位仁兄的教导:\(\text{Min_25}\) 就是 \(\text{DP}\)。
然后是一些记号:
\(p\) 表示质数,\(q\) 表示合数,\(pt(x)\) 表示\(x\) 的最小质因子。
\(p_i\) 是第 \(i\) 大的质数,\(M\) 是最后一个使 \(p_M\le\sqrt{n}\) 的数。
我们现在有一个积性函数 \(f(x)\),这家伙对于 \(f(p)\) 算起来很愉快(有简单的计算方法,且可以拆成一堆完全积性函数的和的形式,如是个项数不多的多项式),并且对于 \(f(p^e)\) 也可以快速得到
那么现在要求 \(\sum_{i=1}^{n}\limits f(i)\),\(n\le 1e11\)
接着,我们把原式分成3部分:
那个\(f(1)\) 最后再算,下文所有操作默认看不见它。
先来尝试求出质数的部分。
首先,既然对于 \(f(p)\) 这玩意都很愉快,那么我们令 \(f'(x)\) 表示假装 \(x\) 是个质数时,\(f(x)\) 的结果。
然后,我们可以把 \(f'(x)\) 拆成一堆完全积性函数 \(f''\) 的和的形式,对于每一个完全积性函数可以分开处理。通常 \(f''\) 的前缀和也很容易求。
如 \(f'(x)=x^2+x\) ,可以把它拆成两个完全积性函数 \(x^2\) 和 \(x\)。
注意到每个合数一定会有最小质因数,那么我们可以考虑通过逐步去掉最小质因数的方法,求出所有质数的部分。
我们整出来这么一个函数 \(g\),使
\(g(,0)\) 就是 \(f''\) 的前缀和,\(g(n,M)\) 就是所有质数的部分,因为不可能会有 \(pt(x)>\sqrt{x}\) 的奇才。
考虑这东西怎么转移:
\(g(i,j)\) 跟 \(g(i,j-1)\) 所相差的,就是那些 \(pt(k)=p_j\) 的 \(f''(k)\),要从 \(g(i,j-1)\) 里面剔除掉这部分。
把这些 \(k\) 去掉 \(p_j\) 后,必须都是 \(pt\ge p_j\),也就是\(pt>p_{j-1}\) 的合数,并且也不能是小于 \(p_j\) 的质数。
唔,这似乎很熟悉。
(\(f''\) 完全积性)
其中 \(sum(x)\) 表示前 \(x\) 个质数 \(f''\) 的和。由于筛得时候只会做到前 \(M\) 个质数,这个可以 \(O(\sqrt{n})\) 预处理。
由于每次筛去的都是 \(pt(k)=p_j\) 的 \(f''(k)\) ,而 \(pt\) 不会超过 \(\sqrt{i}\)。
我们筛到 \(p_j^2 > i\) 的时候就可以退出了,再往上筛就不会有意义喽。
然后只有 \(i\) 可以表示成 \(\lfloor \dfrac{n}{x} \rfloor\) 的 \(g\) 才有意义,因为目标是要求 \(g(n,M)\)
而这样的数最多只有 \(2\sqrt{n}\) 个。
于是可以离散化,把空间降下来;同时,注意到转移时需要的 \(\lfloor \dfrac{i}{p_j} \rfloor\) 一定是小于 \(i\) 的,所以可以滚动数组从大到小逐个转移。
所以空间复杂度是 \(O(\sqrt{n})\) 的。
那么,就可以一路转移到 \(g(,M)\),处理好质数的部分了。
开始考虑合数的部分:
既然是合数,那么一定会有最小质因数,我们按类似 \(g\) 的做法,考虑通过逐个加入每个最小质因数,得到最后的答案。
整一个函数 \(S\),使
这样最后 \(S(n,0)\) 就是答案。
考虑暴力加入最小质因数,大力转移 \(S\)
(这里解释一下那个 \([e\ne 1]\),是因为还要算上 \(f(p_k^e)\) 本身的贡献,但是所有质数的部分已经被算好了)
你可能会好奇那为什么还要有 \(g\) ,直接把\([e\ne 1]\) 改成 \(1\) 不就好了?
因为后面的部分基于一个前提:合数的最小质因数不会超过根号范围。
也就是说,通过对 \(g\) 的处理,我们可以只枚举根号范围内的最小质因数。
不然枚举范围会从 \(\sqrt{n}\) 变成 \(n\),直接暴毙。
复杂度我不会分析,我只知道这家伙能跑 \(1e11\)。
总而言之,\(\text{Min_25}\) 是一种通过每次筛去最小质因数来转移的 \(\text{DP}\)。这家伙能做的也不仅仅是求积性函数的前缀和。
举个例子,求区间质数个数;
也就是求函数 \(f(x) = [x\in p]\) 的前缀和。
\(f(x)\) 显然不是积性的,但是 \(\text{Min_25}\) 仍然可以处理它:
\(f'(x)=1\) ,这倒是完全积性的,\(g(n,M)\) 即为答案。