Official

A - Trailing Zeros Editorial by Nyaan


\(A_1, A_2, \dots,A_N\) という順に値を決めていくことを考えます。このとき、便宜上 \(A_0 = 0\) とすると各 \(i\) について「\(A_{i-1} \lt x\) かつ \(\mathrm{ctz}(x) = T_i\) を満たす最小の \(x\) 」を \(A_i\) とするのが最適です。
ここで \(\mathrm{ctz}(x) = T_i\) という条件を除算を用いて言い換えると、「\(x\)\(2^{T_i}\) で割り切れて \(2^{T_i+1}\)で割り切れない整数である」となります。
\(A_{i-1}\) より大きく \(2^{T_i}\) で割り切れる整数のうち最小のものと 2 番目に小さいものを \(y_1,y_2\) とします。\(y_1\) は 床関数を用いて

\[y_1 = \left(\left\lfloor \frac{A_{i-1}}{2^{T_i}} \right\rfloor + 1 \right) \times 2^{T_i}\]

と表せます。また、\(y_2 = y_1 + 2^{T_i}\) です。
ここで、\(y_1\)\(y_2\) のちょうど一方のみが \(2^{T_i+1}\) で割り切れないので、割り切れない方を選んで \(A_i\) とすればよいです。
また、\(A_i - A_{i-1} \leq y_2 - A_{i-1} \leq 2^{T_i + 1}\) なので、制約を用いると \(A_N\) の上界は以下のように評価できます。

\[ A_N = \sum_{1 \leq i \leq N} (A_i - A_{i-1}) \leq \sum_{1 \leq i \leq N} 2^{T_i + 1} \leq 2^{41} \times 10^5 \lt 2.2 \times 10^{17} \]

よって \(A_N\) は 64 bit 整数の表現可能な値であることが確認できるので、C++ の long long 型などを用いて愚直に計算していけばこの問題を解くことができます。計算量は \(\mathrm{O}(N)\) です。

実装例 (C++)

posted:
last update: