Easyをパッと思いつけなかった上、Pythonじゃ通らない制約のためC++へ書き直したためタイムロス。そのためMedが解きおわらず。
Div1 Easy SuperSubset
部分和問題なのでDPしようとは思えて、あとは上手く辻褄合わせれば良い。
具体的には、初期値をDP[0]=pow(2,len(A))にして、一つ使ったら自由度が半分になるので、
・DP[i+a]+=DP[i]/2
みたいに遷移させれば良い。
Div1 Med ExpectedValue
コーディングフェーズ終了三分後に解き終わった。
A[i]=jのとき、iとjを結ぶとすると、N個の要素が何個のグループに分けられるかで答えは決まる。
愚直解を書いてグループの個数を調べると、
・DP[i][j]=(DP[i-1][j]*(i-1)+DP[i-2][j-1]*(i-1)
のように推測でき、これで答えを求めたら通った。
以下、Practiceでシステムテストを通ったコード。
mod=10**9+7 DP=[[0],[0],[0,1],[0,2],[0,6,3]] for i in range(5,1501): X=[0]*(i//2+1) for j in range(1,i//2+1): if i%2==0 and j==i//2: X[j]=(DP[-2][j-1]*(i-1))%mod else: X[j]=(DP[-1][j]*(i-1)+DP[-2][j-1]*(i-1))%mod DP.append(X) class ExpectedValue(): def solve(self, N): S=sum(DP[N]) ANS=0 for i in range(len(DP[N])): ANS=ANS+i*DP[N][i] ANS%=mod return (S*N-ANS)*pow(S,mod-2,mod)%mod
0 件のコメント:
コメントを投稿