C - Catastrophic Roulette Editorial by maspy


概要

公式解説では,ゲームの開始時点からある時点までの情報を 44 変数で表すことで dp をしていました.

ある時点からゲームの終状態までの情報を考えると, 22 変数での dp の立式ができます.また,適切に立式すれば,無限和の類を考えずに解くことができます(この手の期待値の計算で頻出のテクニックです).


解法

まだ出ていない数の種類が nn である状態(以下「状態 nn」)で先手番から始めたときの,先手番の罰金期待値を FnF_n,後手番の罰金期待値を SnS_n とします.

p=n/Np = n/N, q=1pq=1-p とします(それぞれ未出の数・既出の数が出る確率です).

この状態での先手番は,

  • はじめに未出の数が出たら,次からは状態 n1n-1 での後手番をプレイするとみなせる.
  • はじめに既出の数が出たら,罰金 11 を払ったあと,次からは状態 nn での後手番をプレイすると見なせる.

ことから,Fn=pSn1+q(1+Sn)F_n = pS_{n-1}+q(1+S_n) という立式ができます.同様に,Sn=pFn1+qFnS_n = pF_{n-1} + qF_n という立式ができます.

Fn1,Sn1F_{n-1}, S_{n-1} を既知とすれば,これら 22 つの式は Fn,SnF_n, S_n を未知数とする連立 11 次方程式となり,これを解くことで Fn,SnF_n, S_n が計算できます.n=0n=0 の場合に Fn=Sn=0F_n=S_n=0 であるところからはじめて n=1,2,,Nn=1, 2, \ldots, N の順に計算していけばよいです.

1q21-q^2 による除算があり,この解答例の時間計算量は O(Nlog(mod))O(N\log(\mathrm{mod})) です.なお,1q2=n(2Nn)N21-q^2=\frac{n(2N-n)}{N^2} 等から 2N2N 以下の整数による除算だけが必要なので,時間計算量を O(N)O(N) にすることも可能です.


参考

漸化式は nn に関する多項式行列 M(n)M(n) をかけるという形で表せるので,{Fn}\{F_n\}{Sn}\{S_n\} の計算は行列積 M(1)M(N)M(1)\cdots M(N) の計算という形の問題に帰着できます.このような計算は O(NlogN)O(\sqrt{N}\log N) 時間で行えることが知られており,本問の FN,SNF_N, S_N を含む P-recursive な数列の第 NN 項の計算に使うことができます.

posted:
last update:



2025-04-15 (Tue)
13:53:32 +00:00