Top

AtCoder M-SOLUTIONS プロコンオープン C - Best-of-(2n-1) 500点

M-SOLUTIONS プロコンオープン C - Best-of-(2n-1)

考察

方針として、まず引き分けを考えないときの期待値を求め、その後で引き分けを考えます。
引き分けを考えないときの期待値と、引き分けの発生しない確率があれば、期待値を求めるのは簡単です。引き分けを考えないときの期待値を$M$、引き分けの発生しない確率を$r$とおくと、期待値は$M / r$です。
ということで、$M$を求めることを考えます。
高橋君をA、青木君をBと呼ぶことにします。そして、Aが勝つ確率を$p$、Bが勝つ確率を$q$とおきます(いったん引き分けは考えないため、$p + q = 1$が成り立ちます)。
期待値の求め方ですが、以下の定義を利用します。

値のバリエーションが$N$個、それぞれの値が$x_1, x_2, \ldots, x_N$、各値になる確率が$y_1, y_2, \ldots, y_N$のとき、期待値は$x_1y_1 + x_2y_2 + \ldots + x_Ny_N$

まず、ゲームの行なわれる回数は、$N$回以上$2N - 1$回以下であることは明らかです。なぜなら、どちらかが$N$回勝つためには$N$回以上ゲームを行う必要があり、どちらかが$N$回勝った時点で終わるため$2N - 1$回以下です。

Aが$N$回勝つとき

Bの勝つ回数を$i$とおきます。まずゲームは$N + i - 1$回行われます。このときの内訳は、Aは$N - 1$回勝ち、Bは$i$回勝ちます。そして、最後にAが勝って終わります。文字列で表すと、次のようになります。
AABBBABBBAAA…BBBABABAAAAAB A(Aが$N-1$個、Bが$i$個ランダムに並び、最後にAが置かれます)
Aが$N-1$個、Bが$i$個並ぶような文字列は $_{N-1+i}C_i$ 通りあります。そして、文字列の並びが決まっているとすると、Aは$N$個あってBは$i$個あるため、そのような文字列の並びになる確率は$p^N \times q^i$です。ということで、$N+i$回になる確率は$_{N-1+i}C_i \times p^N \times q^i$となります。

Bが$N$回勝つとき

同じように解くことで、$_{N-1+i}C_i \times p^i \times q^N$とわかります($i$はAの勝つ回数)。
ということで、引き分けを考慮しない期待値$M$を求める式は次のようになります。

\[M = \sum_{i=0}^{N-1} ((N + i) \times _{N-1+i}C_i \times p^N \times q^i) + \sum_{i=0}^{N-1} ((N + i) \times _{N-1+i}C_i \times p^i \times q^N)\]

この式を変形することで、次の式が得られます。

\[M = \sum_{i=0}^{N-1} ((N + i) \times _{N-1+i}C_i \times (p^N \times q^i + p^i \times q^N))\]

$_rC_n$、$A^n$、$B^n$は、事前に計算しておくことで$O(1)$で求められるため、全体として$O(N)$かかります($_rC_n$については、少し工夫が必要です)。
こうして$M$が得られたため、最後に$M / r$を計算して終わりです。

実装

ソースコードはこちらです。$p^n$を繰り返し二乗法で求めているため、計算量は$O(N \log N)$となっています。このように、C++で解いている場合は実行時間制限に余裕があるため、メモ化を行わずに繰り返し二乗法で済ませることが多いです($O(1)$と$O(\log N)$はほぼ同じという感覚です)。

感想

コンテスト本番では、 dp[i][j] := (高橋君がi回、青木君がj回勝ったときの期待値)とおいて解こうとし、$N$の制約に悩まされました…。「引き分けは後から考える」という方針で解けることは知らなかったので、勉強になりました。次にこのような問題が出たときは、選択肢のひとつとして考えたいと思います。