1. paizaラーニングトップ
  2. レベルアップ問題集
  3. Sランクレベルアップメニュー(言語選択)
  4. 問題一覧 Rust(Beta)編
  5. 投票の期待値 Rust(Beta)編

Sランクレベルアップメニューのサムネイル
投票の期待値 Rust(Beta)編(paizaランク S 相当)

問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!

問題

下記の問題をプログラミングしてみよう!

n 人の人が時刻 1 から n まで投票をおこなうことになりました。選択肢は 1 と 2 の 2 つです。i 番目の人は、時刻 i に、自分の意思 a_i または時刻 i - 1 までの投票結果において多数派だった選択肢 b_i に等確率で投票します。ただし、時刻 i - 1 までの投票結果において選択肢 1 と 2 が同数だった場合、a_i に投票します。

最終的に得られる投票結果における選択肢 1 の割合の期待値を q / r として、この値を q × r^(-1) mod (10^9 + 7) の形式で求めてください。(0 ≦ q < r)
ただし、r^(-1) は mod 10^9 + 7 における r の逆元を表します。

入力される値

n
a_1 a_2 ... a_n


・ 1 行目に、整数 n が与えられます。
・ 2 行目に、整数 a_1, a_2, ... a_n が半角スペース区切りで与えられます。


入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。 標準入力からの値取得方法はこちらをご確認ください
期待する出力

最終的に得られる投票結果の期待値を既約分数 q / r として、この値を q × r^(-1) mod (10^9 + 7) の形式で出力してください。

出力の最後に改行を入れ、余計な文字、空行を含んではいけません。

条件

すべてのテストケースにおいて、以下の条件を満たします。

・ 1 ≦ n ≦ 1000
・ a_i は 1 または 2 (1 ≦ i ≦ n)

入力例1

5
1 2 1 1 2

出力例1

600000005

入力例2

10
1 1 1 1 1 1 1 1 1 1

出力例2

1

問題一覧へ戻る

ページの先頭へ戻る