OSU有个推广的,就是求m次的期望是多少,下面这个代码是O(nm)复杂度的,但是我看不懂这个做法,有没有大佬能解释一下,这个和第二类斯特林数是什么关系,拜托这次来个人啊
#include <bits/stdc++.h>
using namespace std;
int n, m, mod = 1000000007;
long long p[100020];
long long a[1020];
long long b[1020];
long long s[1020][120];
long long f[1020];
int main() {
scanf("%d%d", &n, &m);
s[0][0] = 1;
for (int i = 0; i <= m; i++) {
for (int j = 1; j <= i; j++) {
s[i][j] = (s[i - 1][j - 1] + j * s[i - 1][j]) % mod;
}
}
for (int i = f[0] = 1; i <= m; i++) {
f[i] = f[i - 1] * i % mod;
}
for (int i = 1; i <= n; i++) {
scanf("%lld", &p[i]);
p[i] = p[i] * 570000004 % mod;
for (int j = m; j > 0; j--) {
a[j] += a[j - 1];
a[j] *= p[i];
a[j] %= mod;
b[j] += a[j];
b[j] %= mod;
}
a[0] = p[i];
b[0] += a[0];
b[0] %= mod;
}
long long z = 0;
for (int i = 1; i <= m; i++) {
z = (z + b[i - 1] * f[i] % mod * s[m][i]) % mod;
}
printf("%lld\n", z);
return 0;
}