CF1842G Tenzing and Random Operations

md 三个月就忘了。


\[ans = \mathbb{E}\left(\prod_{i = 1}^{n} \left(a_i + v\sum_{j = 1} ^ m[b_j \leq i] \right)\right) \]

拆。

每一位选 \(a_i\) 或者 \(v[b_j \leq i]\) 中的一个。

\(f_{i, k}\)

考虑前 \(i\) 个,选了 \(k\)\(j\)

这一位选 \(a_i\)

$f_{i, j} \leftarrow f_{i, j} + a_i\cdot f_{i - 1, j} $

这一位选原来有过的 \(b_j\)

$f_{i, j} \leftarrow f_{i, j} + v\cdot j \cdot f_{i - 1, j} $

这一位选没选过的 \(b_j\),可以选剩下的,每个 \(\dfrac{i}{n}\) 概率是 \(1\),带来贡献:

$f_{i, j} \leftarrow f_{i, j} +\dfrac{vi}{n} \cdot (m - j + 1) \cdot f_{i - 1, j - 1} $

code
#include <bits/stdc++.h>
using namespace std;
namespace IO {
#define ll long long
    inline ll read() {
        char c = getchar();
        ll x = 0;
        bool f = 1;
        while(c < '0' || c > '9') {
            if(c == '-')
                f = 0;
            c = getchar();
        }
        while(c >= '0' && c <= '9') {
            x = (x << 1) + (x << 3) + (c ^ 48);
            c = getchar();
        }
        return f ? x : ~(x - 1);
    }
    inline void write(ll x) {
        if(x < 0) {
            x = ~(x - 1);
            putchar('-');
        }
        if(x > 9)
            write(x / 10);
        putchar(x % 10 + '0');
    }
#undef ll
}
using IO::read;
using IO::write;
#define eb(x) emplace_back(x)
#define ep(x) emplace(x)
#define ld long double
#define ll long long
ll Pow(ll a, ll b) {
    ll res = 1;
    while(b) {
        if(b & 1)
            res *= a;
        a *= a, b >>= 1;
    }
    return res;
}
ll Pow(ll a, ll b, ll mod) {
    ll res = 1;
    while(b) {
        if(b & 1)
            res = res * a % mod;
        a = a * a % mod, b >>= 1;
    }
    return res;
}
const int maxn = 5010;
const int mod = 1e9 + 7;
int n, m, v;
int a[maxn];
int f[maxn][maxn];
int invn;
void Debug() {
#ifdef LOCAL
#endif
}
signed main() {
    n = read(), m = read(), v = read();
    invn = Pow(n, mod - 2, mod);
    for(int i = 1; i <= n; i++) a[i] = read();
    f[0][0] = 1;
    for(int i = 1; i <= n; i++) {
        for(int j = 0; j <= i; j++) {
            f[i][j] = 1ll * f[i - 1][j] * (1ll * a[i] + 1ll * v * j % mod) % mod;
            if(j) f[i][j] = (f[i][j] + 1ll * f[i - 1][j - 1] * (m - j + 1) % mod * i % mod * invn % mod * v % mod) % mod;
        }
    }
    int ans = 0;
    for(int i = 0; i <= n; i++) ans = (ans + f[n][i]) % mod;
    write(ans);
    return 0;
}
posted @ 2023-10-07 15:48  N2MENT  阅读(15)  评论(0)    收藏  举报