首先考虑怎么计算x
如果只抽一次的话,期望次数应该是m1
然后考虑n次的期望应该就是mn
然后就不对了...因为没有的也有概率和权值为0啊....
i∑n(in)ikpi(1−p)n−i
可能这个p是m1
然后就能直接斯特林展开了
xk=i∑kS(k,i)(ix)i!
首先枚举中了几次,然后抽取x次的概率就是
x=0∑n(nx)(m1)x(mm−1)n−x
权值?我们斯特林展开总不能展开期望 吧?所以只能展开权值啊
x=0∑n(xn)(m1)x(mm−1)n−xi=1∑kS[k][i]i!(ix)
然后这个式子我们神乎其技的展开组合数
x=0∑n(m1)x(mm−1)n−xi=1∑kS[k][i]i!(ix)(xn)
x=0∑n(m1)x(mm−1)n−xi=1∑kS[k][i]i!(in)(x−in−i)
有i!!,所以我们展开其中的第一个组合数吸收
x=0∑n(m1)x(mm−1)n−xi=1∑kS[k][i](n−i)!n!(x−in−i)
然后不太会啊?因为最后面的组合数....想办法二项式反演?
i=1∑kS[k][i](n−i)!n!x=0∑n(m1)x(mm−1)n−x(x−in−i)
因为x-i是负数的时候没用
这个式子要一点神乎其技的操作来把形式搞出来了,枚举x'=x-i
i=1∑kS[k][i](n−i)!n!x′=0∑n−i(m1)x′+i(mm−1)n−x′−i(x′n−i)
然后就没有了啊,右边搞出二项式反演了!n-i'和x!
i=1∑kS[k][i](n−i)!n!(m1)i
直接做即可
code:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int P = 998244353;
const int MAXK = 5007;
ll ans, n, k, m;
int S[MAXK][MAXK], fac[MAXK], ifac[MAXK], f[MAXK];
inline ll ksm(ll x, ll y) {
ll ans = 1;
while(y) {
if(y & 1)ans = ans * x % P;
x = x * x % P;
y >>= 1;
}
return ans;
}
inline void init() {
fac[0] = fac[1] = 1;
ifac[0] = ifac[1] = 1;
S[0][0] = 1;
for(int i = 1; i <= k; ++i) {
for(int j = 1; j <= k; ++j) {
S[i][j] = (1ll * S[i - 1][j] * j % P + S[i - 1][j - 1]) % P;
}
}
for(int i = 1; i <= k; ++i) {
fac[i] = 1ll * i * fac[i - 1] % P;
}
ifac[k] = ksm(fac[k], P - 2);
for(int i = k - 1; i > 1; --i) {
ifac[i] = 1ll * ifac[i + 1] * (i + 1) % P;
}
f[0] = 1;
//n!/(n-1)!
for(int i = 1; i <= k; ++i) {
f[i] = 1ll * f[i - 1] * (n - i + 1) % P;
}
return ;
}
inline void add(ll &x, ll y) {
x += y;
if(x >= P)x -= P;
}
int main() {
scanf("%lld%lld%lld", &n, &m, &k);
init();
ll wn = ksm(m, P - 2), w = 1;
for(int i = 1; i <= k; ++i) {
w = w * wn % P;
add(ans, w * S[k][i] % P * f[i] % P);
}
printf("%lld\n", ans);
return 0;
}