// Problem: CF1842G Tenzing and Random Operations
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/CF1842G
// Memory Limit: 1000 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const int mod = 1e9 + 7;

ll pw(ll b, ll p) {
    ll res = 1;
    b %= mod;
    while (p > 0) {
        if (p & 1) res = res * b % mod;
        b = b * b % mod;
        p >>= 1;
    }
    return res;
}

ll inv(ll n) {
    return pw(n, mod - 2);
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int n;
    ll m, v;
    cin >> n >> m >> v;

    vector<ll> a(n);
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
    }

    vector<ll> dp(n + 1, 0);
    
    dp[0] = a[0];
    dp[1] = v;

    for (int i = 2; i <= n; ++i) {
        vector<ll> ndp(n + 1, 0);
        ll r = (ll)(i - 1) * inv(i) % mod;

        ndp[0] = a[i - 1] * dp[0] % mod;

        ll rkm1 = 1; 
        for (int k = 1; k <= i; ++k) {
            ll rk = rkm1 * r % mod;
            
            ll t1 = 0;
            if (k < i) {
                t1 = (a[i - 1] + v * k % mod) % mod * rk % mod * dp[k] % mod;
            }
            
            ll t2 = v * rkm1 % mod * dp[k - 1] % mod;
            
            ndp[k] = (t1 + t2) % mod;
            rkm1 = rk;
        }
        dp = ndp;
    }

    ll ans = 0;
    ll mf = 1; 
    ll mm = m % mod;

    for (int k = 0; k <= n; ++k) {
        ans = (ans + dp[k] * mf) % mod;
        mf = mf * (mm - k + mod) % mod;
    }

    cout << ans << endl;

    return 0;
}

0 条评论

目前还没有评论...