C - 階乗と素因数 Editorial by shinchan


ルジャンドルの定理を用いると以下がわかります。

\[ F(N, p) = \sum_{i=1}^{\infty} \left\lfloor \frac{N}{p^i} \right \rfloor < \sum_{i=1}^{\infty} \frac{N}{p^i} \]

\(N - F(N, p)\) に注目します。

\[x = N - F(N, p) > N - \sum_{i=1}^{\infty} \frac{N}{p^i} \geq \left\{ \begin{array}{l} \displaystyle 0 & \text{if} ~~ p=2 \\ \frac{N}{2} & \text{if} ~~ p>2 \end{array} \right. \]

よって \(p \neq 2\) のとき、\(N\) は高々 \(2x\) であることがわかるので、 そのテストケースにおいて \(O(x \log N)\) で求めることができます。

\(p=2\) の場合について考えます。実験すると答えをすぐエスパーできますが、あえて考察してみましょう。

\(N\)\(2\) 進数で考えます。ルジャンドルの定理をにらむと、下から数えて \(1\) ビット目が \(0\)\(1\) かによって、\(F(N, p)\) には変化がないことがわかります。つまり、\(N\)\(1\) ビット目を立たせると \(N - F(N, p)\)\(1\) 増えます。同様に、\(2\) ビット目を立たせると、\(N\)\(2\) 増えるのに対して、\(F(N, p)\)\(1\) しか増えないため、 \(N - F(N, p)\)\(1\) 増えます。

\(N\) の下から \(i\) ビット目を立たせると \(N - F(N, 2)\)\(1\) 増えることは、\(N=2^{i-1}\) とすると \(F(N, 2) = \frac{N}{2} + \frac{N}{4} + ... + 1 = N-1 \) になることからわかります。

以上から、\(N\) の立ってないビットを立てれば \(N- F(N, 2)\)\(1\) 増え、逆だと \(1\) 減ります。\(N=0\) のとき \(N- F(N, 2) = 0\) であることと合わせると、\(N- F(N, 2)\) はpopcountに等しいことがわかります。したがって、popcountが \(x\) になるような最小の非負整数を求めればよく、これは \(2^x - 1\) となります。

posted:
last update: