AtCoder Beginner Contest(ABC) 194 D - Journey の解説
はじめに
この間のAtCoder Beginner Contest(ABC)194のD問題が解けなかったので、復習を兼ねて簡単な解説を書きます。 使用言語はpythonを想定しています。
D - Journeyの問題文
頂点から頂点 までの頂点からなるグラフの頂点に高橋君がいます。今このグラフに辺はつも張られていません。 高橋君は以下の操作を繰り返します。
操作 :
(今高橋君がいる頂点も含めた)個の頂点の中からつランダムに選ぶ。各頂点が選ばれる確率は全てであり、選択は操作毎に独立である。
今高橋君がいる頂点と選ばれた頂点の間に無向辺を張り、選ばれた頂点に移動する。
グラフが連結になるまでに行われる操作の回数の期待値を求めてください。
ただし、である。
解答までの道のり
問題文をよく見る
まず問題文を見て思うのが、「グラフが連結ってどういう意味?」ということです。(無知) どうやらグラフが連結というのは「任意の重複しない2頂点を選択したときに、それらを結ぶパスが存在すること」です。 つまり、図のようなことを言っています。 この図を見るにどうやら今回の問題ではグラフが連結になるということはすべての頂点を1回以上選択するというのに言い換えられるということがわかります。 少しとっつきやすくなったかな・・・?
実験してみる
なんかではあまり参考にならなさそうなのでで考えます。
・・・わからない! AtCoderの公式の解説を見ても、これはどうやら知っているかどうかが決め手となる問題みたいです。
必要となる知識
これは公式解説に詳しいことが載っているのですが、
「確率で成功する試行を、成功するまで行うときの試行回数の期待値はである。」
というものです。
知識を持った上で実験
で考えます。 で、すべての頂点を1回以上選択するルートは、があります。 今回は問題の性質上、頂点以外の区別はしなくても良いので、という感じになります。
まず、のとき、このように遷移する確率はなので、期待値はとなります。
次に、のとき、このように遷移する確率はなので、期待値はとなります。
これらを足し合わせるととなります。
解答はこれをに拡張するだけですね。
解答
N = int(input()) ans = 0 for i in range(1, N): ans += N/(N-i) print(ans)
感想
こんな短い解答なのか・・・。 まあ知らなきゃ解けない問題なのでクヨクヨせずに次は頑張ろう!