AGC028 B問題 Removing Blocks
editorialで確率がどうのこうの書いてあって ??? となったので。
方針
最終的に求めたい答えは当たり前だけど の形でかける.
そして , の値を求めにいく.
- で求めること.
- を取り除く時にが連結である場合の数を全体の 通りの中の割合で求めること.
この二つが大きなポイントだと思う. 二つ目の方から考える.
2つ目のポイントの考察
※下記ではとして議論する.
を取り除く時にが連結である 間でが最初に除かれる.
と言い換えることができる.では,その場合の数はN!のうちどのくらいの割合なのか?
間で,初めて取り除かれるものをとし , これによって事象を定義する.
すなわち , 全事象
これらは排反の事象であり , 確率(場合の数の割合)はどの事象も等しく となっている.
が最初に除かれる場合の数を知りたかったので, 全体の場合の数をかけて
あと , と条件を取っ払えば
1つ目のポイントの考察
あとはさっきの結果を代入してあげればok
最後にもう一工夫.
より , を先に計算(累積和)しておくことができる.
すると がで求まるようになる.
なので,全体は答え は で求まる.
ソースコード
N = int(input()) A = list(map(int,input().split(" "))) mod = 10**9+7 # N!計算 fact = 1 for i in range(2,N+1): fact *= i fact %= mod # 場合の数計算 rev = [ (pow((i),mod-2,mod)*fact)%mod for i in range(1,N+1) ] # 累積和 for i in range(N-1): rev[i+1] += rev[i] rev[i+1] %= mod # a_0 A_0 + a_1 A_1 + ... + a_n A_n を計算 ans = 0 for i in range(N): ans += A[i] * (rev[i] + rev[N-1-i] - rev[0]) % mod ans %= mod print(ans)
感想
解けてから見ると問題文にわざわざ通りとか書いてくれてるのはヒントだったのかなぁと思ったり。