[yukicoder] No. 1299 Random Array Score
問題
方針
期待値の問題では、\( 1 \) 回あたりどうなるかを考えることがあります。
\( i \) 回目の操作後の数列 \( A \) の総和を \( X_i \) とします。このとき、
\[ E[X_0] = A_1 + A_2 + \cdots + A_N\]
\( i \) 回目の操作後の配列の \( j \) 番目の値を \( A(i, j)\) とすると、
\[ E[A(i, j)] = E[A(i – 1, j)] + \dfrac{E[A(i – 1,0)] + E[A(i – 1,1)] + \cdots + E[A(i – 1,N)]}{N}\]
となります。ここで、
\[ S(i) = E[A(i, 0)] + E[A(i, 1)] + \cdots + E[A(i, N)]\]
とすると、
\[E[X_i] = 2S(i) \]
となります。したがって、\(E[X_K] = 2^{K}S(0) \) となります。
コード
#include <bits/stdc++.h> using namespace std; typedef long long ll; const ll MOD = 998244353; // a^n mod を計算する ll modpow(ll a, ll n, ll mod) { ll res = 1; while (n > 0) { if (n & 1) res = res * a % mod; a = a * a % mod; n >>= 1; } return res; } int main() { int N; ll K; cin >> N >> K; ll A[N]; ll sum = 0; for (int i = 0; i < N; i++) { cin >> A[i]; sum += A[i]; } ll ans = (sum % MOD) * modpow(2, K, MOD); cout << (ans) % MOD << "\n"; return 0; }
ディスカッション
コメント一覧
まだ、コメントがありません