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)+\sum_{p}f(p)+\sum_{q}f(q) \]

那个\(f(1)\) 最后再算,下文所有操作默认看不见它

先来尝试求出质数的部分。

首先,既然对于 \(f(p)\) 这玩意都很愉快,那么我们令 \(f'(x)\) 表示假装 \(x\) 是个质数时,\(f(x)\) 的结果。

然后,我们可以把 \(f'(x)\) 拆成一堆完全积性函数 \(f''\) 的和的形式,对于每一个完全积性函数可以分开处理。通常 \(f''\) 的前缀和也很容易求。

\(f'(x)=x^2+x\) ,可以把它拆成两个完全积性函数 \(x^2\)\(x\)

注意到每个合数一定会有最小质因数,那么我们可以考虑通过逐步去掉最小质因数的方法,求出所有质数的部分。

我们整出来这么一个函数 \(g\),使

\[g(i,j)=\sum_{k\in p \ or \ pt(k)>p_j } f''(k) \]

\(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\) 的质数。

唔,这似乎很熟悉。

\[g(i,j)=g(i,j-1)-f''(p_j)(g(\lfloor \frac{i}{p_j} \rfloor,j-1)-sum(j-1)) \]

\(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(i,j)=\sum_{pt(k)>p_j}^{i}{f(k)} \]

这样最后 \(S(n,0)\) 就是答案。

考虑暴力加入最小质因数,大力转移 \(S\)

\[S(i,j)=g(i,M)-sum(j)+\sum_{k=j+1,p_k^2 \le i}\sum_{e=1}f(p_k^e)(S(\lfloor \frac{i}{p_k^e} \rfloor,k)+[e\ne 1]) \]

(这里解释一下那个 \([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)\) 即为答案。


posted @ 2021-05-07 16:18  RUI_R  阅读(140)  评论(0编辑  收藏  举报