[突发奇想]重推min_25
牢骚和推导
忘记 \(\tt min\_25\) 了,重新推一遍,顺便理清思路。
对于一个函数 \(f(x)\),它是一个积性函数,并且 \(f(p),f(p^k)\) 都比较好得到,现在问 \(F(i)=\sum_{i=1}^nf(i)\).
对于 \(F\),我们分质数、合数与 \(1\) 三种情况考虑,就有
对于合数部分,我们改写一下,有
然后我们定义 \(S(n,j)\) 表示所有 \((1,n]\) 以内的,最小质因数大于 \(p_j\) 的数的函数值之和,那么就有
对于这个 \(S\) 的求值,我们也可以分成质数、合数两个部分考虑,定义 \(G(i)\) 表示 \([1,i]\) 中质数的函数值之和,那么有
这个东西就可以递归做了,但是还有一个问题:这个 \(G\) 怎么处理?
定义 \(g(i,j)\) 表示 \([2,i]\) 以内的质数或者最小质因数大于 \(p_i\) 的数的函数值之和,不难发现,有边界情况
这个 \(g()\) 的递推过程,我们可以考虑成每一次筛,其实就是将当前最小的质数所拥有的一个合数筛掉,但是要注意筛这个质数的时候可能会把前面的质数重复筛,这个就要重新加上。至于为什么这里是 \(g\left(\left\lfloor{i\over p_j}\right\rfloor,j-1\right)\) 呢?因为我们是从 \(g(i,j-1)\) 中筛掉的,所以自然这里也是 \(j-1\) 了。
然后我们一直推进,直到某个时刻 \(p_j=P\)(\(P\) 是 \(\sqrt n\) 以内最大的质因数)时,就有 \(G(n)=g(n,P)\).
最后实现的时候,每个 \(f()\) 拆出来的单独的一项函数单独用一个 \(g()\) 进行计算,并且注意到这个递推关系是相邻之间的关系,所以只需要开一维数组。
一些感悟
重新推了一遍,还花了比较久的时间,但是重新理了一遍思路。
对于 \(g\),我们实际上只是想要 "质数" 的部分,但是无奈不能一次解决,所以就变成了 "质数以及最大质因数大于 \(p_j\) 的数的函数值之和",然后通过每次将 \(p_j\) 变大,逐一筛去一些以质数为基础的合数,最后得到我们想要的。
对于 \(S\),我们实际上想要的是 \(S(n,0)\),但是无奈这样的数太多了,我们就只好先定义其为 "最小质因数大于 \(p_j\) 的数的函数值之和",然后每次放低要求,最后得到我们想要的。
也就是说,对于 \(g\) 而言,我们实际上每次在筛掉一些数,对于 \(S\),我们每次都在加入一些数。