hihoCoder #1639 图书馆
题目大意
给定 \(n\)(\(1\le n\le 1000\))个正整数 \(a_1, a_2, \dots, a_n\)(\(a_i \le 10^{12}\)),令 \(s\) 为这 \(n\) 个数之和。求
解法
中国剩余定理。
设上式中左边的商为 \(x\),先分别求出 \(x \bmod 2\) 和 \(x\bmod 5\), 再利用中国剩余定理就可求得答案。
这个问题归结为:
对于素数 \(p\) 和正整数 \(n\),将 \(n!\) 写成 \(n! = ap^{k}\),且 \(p\) 不是 \(a\) 的因子。求 \(a\) 和 \(k\) 。
不难发现:
设 \(n\) 的 \(p\)-进制展开式为
则有
\begin{align}
k & = [n/p] + [n/p^2] + [n/p^3] + \dots + [n/p^r] \\
a & \equiv (p-1)!^{k} b_0! b_1! \dots b_r! \pmod{p} \label{Eq:2}
\end{align}
其中 \([x]\) 表示不超过 \(x\) 的最大整数。
(令 \(B = b_0 + b_1 + ... + b_r\),不难证明,\(k\) 还可以写成 \(k = \frac{n - B}{p-1}\))
根据 Wilson 定理,\eqref{Eq:2} 可写成
\begin{equation}
a \equiv (-1)^{k} b_0! b_1! \dots b_r ! \pmod{p}
\end{equation}
算法的复杂度为 \(O(p + \log_p n)\) 。
从这个问题中积累的新模型
一、\(\frac{A}{B}\bmod p\)(\(B\) 能整除 \(A\) 且 \(p\) 是素数)的解法。
二、\(n! \bmod p\)(\(p\) 是素数) 的解法。
下面考虑:模数不是 \(10\) 而是 \(20\) 的情况下,此题如何求解。
仍循旧思路,采用中国剩余定理,我们需要求出 \(x \bmod 4\);按旧办法求当然是可以的。注意:由于要预处理出 \(0\) 到 \(p-1\) 的阶乘,所以(对于旧思路)能否用 Wilson 定理并不影响复杂度。
如果模数的某个素因子的次数 \(k\) 很高,求 \(x \bmod p^k\) 的复杂度 \(O(p^k + \log_{p^k} n)\) 就不能容忍了。很自然地,我们会考虑 \(x\bmod p\) 与 \(x\bmod p^k\) 之间的关系。
(留坑)