hihoCoder #1639 图书馆

题目大意

给定 \(n\)\(1\le n\le 1000\))个正整数 \(a_1, a_2, \dots, a_n\)\(a_i \le 10^{12}\)),令 \(s\) 为这 \(n\) 个数之和。求

\[\frac{s! } {\prod\limits_{1\le i\le n} a_i !} \bmod 10 \]

解法

中国剩余定理。

设上式中左边的商为 \(x\),先分别求出 \(x \bmod 2\)\(x\bmod 5\), 再利用中国剩余定理就可求得答案。

这个问题归结为:
对于素数 \(p\) 和正整数 \(n\),将 \(n!\) 写成 \(n! = ap^{k}\),且 \(p\) 不是 \(a\) 的因子。求 \(a\)\(k\)

不难发现:
\(n\)\(p\)-进制展开式为

\[n = b_0 + b_1 p + b_2 p^2 + \dots + b_r p^r \qquad ( 0 \le b_i \in \mathbb{Z} < p, b_r > 0) \]

则有
\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\) 之间的关系。
(留坑)

posted @ 2018-01-01 13:49  Pat  阅读(253)  评论(0编辑  收藏  举报