結果
問題 | No.995 タピオカオイシクナーレ |
ユーザー |
|
提出日時 | 2021-06-16 13:56:38 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 133 ms / 2,000 ms |
コード長 | 979 bytes |
コンパイル時間 | 923 ms |
コンパイル使用メモリ | 82,560 KB |
実行使用メモリ | 77,824 KB |
最終ジャッジ日時 | 2024-12-30 11:59:07 |
合計ジャッジ時間 | 4,544 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 23 |
ソースコード
""" p/q m,n<=10**5 m<=n k<=10**12 各粒が最終的にミルクティーの中にいる確率を求め、足し上げる。 ミルクティー中、キッチンのタピオカそれぞれまとめて計算 行列積のダブリングでOK A:v->v v=(x,y) x:ミルクティー中、y:キッチン中 A=((1-p/q,p/q),(p/q,1-p/q)) """ n,m,k,p,q=map(int,input().split()) b=[int(input()) for _ in range(n)] mod=10**9+7 # 行列積 def dot(mtr0,mtr1): a,b=len(mtr0),len(mtr1[0]) t=len(mtr0[0]) if t!=len(mtr1):return None ret=[[0]*b for _ in range(a)] for i in range(a): for j in range(b): tmp=0 for k in range(t): tmp+=mtr0[i][k]*mtr1[k][j] tmp%=mod ret[i][j]=tmp return ret # 使用例 # mtr:演算行列 # dp:dp行列。初期値として単位行列 dp=[[sum(b[:m])],[sum(b[m:])]] tmp=p*pow(q,mod-2,mod)%mod mtr=[[(1-tmp)%mod,tmp],[tmp,(1-tmp)%mod]] while k: if k&1: dp=dot(mtr,dp) k>>=1 mtr=dot(mtr,mtr) print(dp[0][0])