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;
}