競技プログラミング日記

主に AtCoder の記事です

AtCoder Beginner Contest 323E問題

ABC323E

解法

問題文がおかしい? 誤解していたが,テストケースを見て読み取れた. 正しくは,\(X+0.5\)秒の時点で曲0が流れている確率. 時刻 \(y \in [0,X]\) において,\(y\) に曲が開始される確率を求めておけば十分. これは dp で求まる. 計算量は,全体で\(O(NX)\). dpをする際,状態が\(O(X)\), 遷移が\(O(N)\).

使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925"

int main() {
  ll n, x;
  cin >> n >> x;
  vll a(n); rep(i,n) { cin >> a[i]; }

  vector<mint> dp(x+1);
  dp[0] = 1;
  mint inv = mint(1)/mint(n);
  rep(y,x+1) rep(i,n) {
    if(y+a[i] <= x) dp[y+a[i]] += dp[y]*inv;
  }

  mint  ans = 0;
  rep(y,x+1) if(y+a[0] > x){
    ans += dp[y]*inv;
  }
  cout << ans.val() << endl;
 
  return 0;
}