[yukicoder] No. 1299 Random Array Score

2020年12月12日

問題

方針

期待値の問題では、\( 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;
}