Official

E - Cheese Editorial by maroonrk_admin


\(k=N-1\) の場合を解きます.

\(0 \leq i \leq N-1\) について,座標 \(i\) からチーズを投げる回数 \(a_i\) を決め打ったとします. なお,回数を決め打っただけなので順番には自由度がありますが,実は順番には意味がないことが以下の考察よりわかります. よって,最後にこの回数分布を達成する確率を乗算することにしておきます.

更に,座標 \(-0.1\) をチーズが通る回数 \(x\) も決め打ちます.

この時,各 \(0 \leq i \leq N-1\) について,座標 \(i +0.1\) をチーズが通る回数 \(b_i\) は,\(b_i=x-i+\sum_{j \leq i} a_j\) と求まります.

\(0 \leq i < N-1\) については,\(i \to i+1\) へと向かう \(b_i\) 個のチーズのうち,いずれかをねずみが食べることになります. これが起こる確率は \(1-1/2^{b_i}\) です.

また \(i=N-1\) については,\(b_i\) 個のチーズがどれも食べられないことになるため,これが起こる確率は \(1/2^{b_i}\) です.

なお,\(b_i\) が途中で負になることがありえますが,これは特に対処する必要はありません.なぜなら,そのような場合どこかの段階で \(b_i=0\) になり,\(1-1/2^{b_i}=0\) が乗算されるためです.

ここで注意するべきは,これらの確率をすべてかけることで,\(a_i\)\(x\) を決め打った場合の答えが求まるわけではないということです. なぜなら,今数えた解の中には,独立したサイクル(始点終点が存在しないチーズ)が含まれるかもしれないからです. ですが,このようなサイクルを一つ追加すると,確率が \(1/2\) になるということから,正しい解だけを数えることが可能です. 具体的にはまず,すべての \(0 \leq x\) について確率の(無限)和を取ります.この時,任意の正しい解に対し,それに \(i\) 個のサイクルを付け足したものは \(2^i\) の重みを持っています.\(1+1/2+1/4+\cdots=2\) であることから,正しい解の重みは \(2\) 倍になっているとわかるので,結局,上で求めたものを \(1/2\) 倍すれば正しい解だけを数えることができます.

すべての \(0 \leq x\) についての確率の無限和を取ることを考えます.\(y=1/2^x\) とおくと,すべての確率は \(y\) の多項式として表すことができます.よって,最後に各 \(p\) について \(y^p=1/2^{xp}=(1/2^p)^x\) の無限和を計算すれば良いです.

最後に,\(a_i\) を固定せずに動かす必要がありますが,これも上と同様に \(y\) を定義し,\(y\) の多項式を管理するDPを行えばよいです.

一つの \(k\) あたり \(O(N^4)\) 時間で計算でき,全体で \(O(N^5)\) 時間のアルゴリズムになります.定数倍が遅くなければ \(O(N^6)\) でもACできます.

posted:
last update: