E - Critical Hit Editorial by Nyaan


\(\mathrm{O}(\log N)\) 解法を簡単に説明します。( 公式解説 の内容を少し発展させた内容なので、公式解説を読んでいない方は先にそちらを読むことをお勧めします)

公式解説の解法 1 の議論より(文字の置き方は異なります) \(p = P / 100\) として

\[b_0 = 1, b_1 = 1 - p, b_k = (1-p) b_{k-1} + p b_{k-2} (k \geq 2)\]

としたときの \(\sum_{i=0}^{N-1} b_i\) がこの問題の答えとなります。(これを \(a_N\) と置きます。)

この漸化式を行列の形で表現すると次のようになります。

\[ \begin{aligned} \left( \begin{array}{c} b_k \\ b_{k-1} \\ a_{k+1} \end{array} \right) = \left( \begin{array}{ccc} 1-p & p & 0 \\ 1 & 0 & 0 \\ 1-p & p & 1 \end{array} \right) \left( \begin{array}{c} b_{k-1} \\ b_{k-2} \\ a_k \end{array} \right) \end{aligned} \]

よって求めたい \(a_N\) に関して

\[ \begin{aligned} \left( \begin{array}{c} b_{N-1} \\ b_{N-2} \\ a_N \end{array} \right) = \left( \begin{array}{ccc} 1-p & p & 0 \\ 1 & 0 & 0 \\ 1-p & p & 1 \end{array} \right)^{N-2} \left( \begin{array}{c} b_1 \\ b_0 \\ b_0 + b_1 \end{array} \right) \end{aligned} \]

という式が成り立ち、行列累乗の部分を繰り返し二乗法で計算することで \(\mathrm{O}(\log N)\) で答えを求めることができます。
また、上の式を変形して \(a_N\) に関する式を得ることもできて、

\[a_N = \frac{(-p)^{N+1} + p(N + 1) + N}{(p+1)^2}\]

であることがわかるので、この式を直接計算しても \(\mathrm{O}(\log N)\) で解くことができます。

posted:
last update: