首先先来看第一轮的
假如有n个,每轮那k个
他们的高度的可能性分别为
n 1/C(n,k)
n+1 C(n-(k-1+1),1)/C(n,k)
n+2 C(n-(k-2+1),2)/C(n,k)
n+i C(n-(k-i+1,i)/C(n,k)
通过概率和高度算出第一轮增加的期望
然后乘上m轮增加的高度加上初始高度,就是总共增加的高度
下面是题解写的过程
const int inf = 0x3f3f3f3f3f3f3f3f, N = 2e5 + 5, mod = 998244353;
int qpow(int a, int b) {
int res = 1;
while (b) {
if (b & 1) res = res * a % mod;
b >>= 1;
a = a * a % mod;
}
return res;
}
int fpow(int x, int r) {
int result = 1;
while (r) {
if (r & 1)result = result * x % mod;
r >>= 1;
x = x * x % mod;
}
return result;
}
namespace binom {
int fac[N], ifac[N];
int __ = [] {
fac[0] = 1;
for (int i = 1; i <= N - 5; i++)
fac[i] = fac[i - 1] * i % mod;
ifac[N - 5] = fpow(fac[N - 5], mod - 2);
for (int i = N - 5; i; i--)
ifac[i - 1] = ifac[i] * i % mod;
return 0;
}();
inline int C(int n, int m) {
if (n < m || m < 0)return 0;
return fac[n] * ifac[m] % mod * ifac[n - m] % mod;
}
inline int A(int n, int m) {
if (n < m || m < 0)return 0;
return fac[n] * ifac[n - m] % mod;
}
}
using namespace binom;//求解排列组合
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int T;
cin >> T;
while (T--) {
int n, m, k;
cin >> n >> m >> k;
int fen = qpow(C(n, k), mod - 2);
int ans = 0;
// cout << C(3, 3) << '\n';
ans = (ans + n * fen) % mod;
for (int i = 1; i <= k; i++) {
// cout << "------\n" << n - (k - i)-1 << ' ' << (k-i) << "\n" << "---------\n";
// cout << C(n - (k - i) - 1, i) << '\n';
ans = (ans + ((n+i) * fen) % mod * C(n - (k - i+1), i) % mod) % mod;
}
int w = (ans - n + mod) % mod;
cout << (n + w * m % mod) % mod << '\n';
}
}