D - I Wanna Win The Game 解説
by
maspy
公式解説の漸化式を見ると、FFT により高速化できることが分かります。
\(\text{dp}[2^{n+1}-1]\) までの値がすべて \(\text{dp}[2^{n}-1]\) までの値から計算されているところに注意しましょう。具体的には以下の通りです。
\(C[i] := \binom{N}{2i}\) とおきます。
- \(\text{dp}[0], \ldots, \text{dp}[2^n-1]\) が計算できているとする
- \(\text{dp}[0], \ldots, \text{dp}[2^{n+1}-1]\) が次の式に従って計算できる
- \(\text{dp}[2m] = \sum_{i+j=m}\text{dp}[i]C[j]\)
計算量 \(O(M\log M)\) 解法になりました。
解答例:https://atcoder.jp/contests/arc116/submissions/21369345
計算量解析
FFT を \(O(\log M)\) 回程度行うため、\(O(M\log^2M)\) との勘違いが起こりやすいですが。
長さ \(\frac{M}{2^n}\) のFFT を行う形になるため、
\(\sum_{n=0}^{\infty} \frac{M}{2^n}\log \frac{M}{2^n}\leq \sum_{n=0}^{\infty}\frac{M}{2^n}\log M\leq 2M\log M\)
などの計算から、全体で \(O(M\log M)\) 時間であることが分かります。
二項係数も \(M\) 番目までしか要らないので、前計算は \(O(M)\) 時間で行うことができます。
投稿日時:
最終更新: