闲扯
感觉很有意义的一道题,最主要的是关于 $S(n)$ 的计算方式,很值得借鉴。
题面
Solution
我们先看 $S(n)$ 怎么计算。
首先,我们有 $S(n)=\sum_{d|n}2^{\omega(d)}$ ,其中 $\omega(n)$ 。
我们如果直接按照这个来写,显然是对每一个 $S(n)$ 的计算都是 $O(\sqrt{n})$ 的,但是我们的 $n$ 是阶乘,而且有 $10^7$ 这么大,很显然不可做。
考虑改变一下计算式。
事实上, $S(n)$ 还有如下的计算方法。
设 $n=p_1^{a_1}p_2^{a_2}\cdots p_k^{a_k}$ ,那么我们有 $S(n)=(2a_1+1)(2a_2+1)\cdots(2a_k+1)$ 。
这是什么意思呢?
考虑一个正整数约数之和的计算,我们有 $S=(1+p_1+p_1^2+\cdots p_1^{a_1})\cdots(1+p_k+p_k^2+\cdots p_k^{a_k})$ 。
这个式子拆开实际上是包含了所有的 $n$ 的约数的。
同理,我们将每一个质因子分开看。
假设我们包含 $p^k$ ,其中 $p$ 是一个质数。
那么对于每一个 $p_s,s\in[0,k]$ ,它们的代价分别是 $1,2,2,2,\cdots,2$ 。
那么我们像上面一样将它们乘起来,就得到了上面关于 $S(n)$ 的计算式。
因为每次会在原来的基础上多乘一个 $i$ ,我们可以先预处理出每一个数的最大质因子,然后在之前的基础上调整即可得到答案。
Code
1 |
|