非常有趣(
考虑设bnb_nbn为第nnn个数被减去的次数,那么对于KKK次之后的某个局面,答案就是
∏i=1nai−∏i=1n(ai−bi)
\prod_{i=1}^n a_i - \prod_{i=1}^n (a_i-b_i)
i=1∏nai−i=1∏n(ai−bi)
的期望值
实际上就是
∏i=1nai−∑∑bi=kk!nk∏i=1nbi!∏i=1n(ai−bi)
\prod_{i=1}^n a_i - \sum_{\sum b_i=k} \frac{k!}{n^k \prod_{i=1}^n b_i!} \prod_{i=1}^n (a_i-b_i)
i=1∏nai−∑bi=k∑nk∏i=1nbi!k!i=1∏n(ai−bi)
也就是说,我们把bi!b_i!bi!挪进去,对于∑∑bi=k∏i=1nai−bibi!\sum_{\sum b_i=k}\prod_{i=1}^n \frac{a_i-b_i}{b_i!}∑bi=k∑i=1∏nbi!ai−bi计算贡献
这一块的贡献我们可以考虑生成函数,对于每一个ai−bibi!\frac{a_i-b_i}{b_i!}bi!ai−bi,他的生成函数就是
Fi(x)=∑j=0∞(ai−j)xjj!F_i(x)=\sum_{j=0}^{\infin} \frac{(a_i-j)x^j}{j!}Fi(x)=∑j=0∞j!(ai−j)xj
大力化简一下,就是Fi(x)=(ai−x)exF_i(x) = (a_i-x) e^xFi(x)=(ai−x)ex
然后我们乘一下,那么Fi(x)=enx∏i=1n(ai−x)F_i(x)=e^{nx}\prod_{i=1}^n(a_i-x)Fi(x)=enxi=1∏n(ai−x)
然后前面的展开,后面的暴力
记得乘上k!nk\frac{k!}{n^k}nkk!
如果把生成函数乘完之后的系数设为ci,c_i ,ci,这样答案就是
∑i=0nci∏j=k−i+1kjni
\sum_{i=0}^n c_i \frac{\prod_{j=k-i+1}^{k} j}{n^i}
i=0∑ncini∏j=k−i+1kj
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
#define SZ(x) ((int)(x).size())
using ll = long long;
ll KSM(ll a, ll k, ll mod) {
ll ret = 1 % mod;
for (; k; k >>= 1, a = a * a % mod)
if (k & 1)
ret = ret * a % mod;
return ret;
}
vector<int> mul(vector<int> const& f, vector<int> const& f2, int const& mod) {
auto ret = vector<int>(SZ(f) + SZ(f2) - 1, 0);
for (int i = 0; i < SZ(f); ++i)
for (int j = 0; j < SZ(f2); ++j)
ret[i + j] = (ret[i + j] + 1LL * f[i] * f2[j] % mod) % mod;
return ret;
}
int const N = 5005;
int const mod = 1e9 + 7;
int a[N];
int n, K;
int main() {
cin >> n >> K;
for (int i = 1; i <= n; ++i)
cin >> a[i];
auto f = vector<int>(1, 0);
f[0] = 1;
long long ans = 1;
for (int i = 1; i <= n; ++i) {
auto t = vector<int>(2, 0);
t[0] = a[i];
t[1] = -1;
f = mul(f, t, mod);
ans = ans * a[i] % mod;
}
long long jc = 1, inv = 1;
long long inv_n = KSM(n, mod - 2, mod);
for (int i = 0; i <= n; ++i) {
ans = (ans - 1LL * f[i] * jc % mod * inv % mod) % mod;
jc = jc * (K - i) % mod;
inv = inv * inv_n % mod;
}
cout << (ans % mod + mod) % mod << '\n';
}