#include<iostream> #include<unordered_map> #define maxn 110 #define ll long long usingnamespacestd;
constint p = 998244353;
ll pow_mod(ll x, ll n){ ll s = 1; for (; n; n >>= 1, x = x * x % p) if (n & 1) s = s * x % p; return s; }
int n, k, D;
ll C[maxn][maxn], fac[maxn], inv[maxn]; voidinit_C(int n, int k){ fac[0] = 1; for (int i = 1; i <= k; ++i) fac[i] = fac[i - 1] * i % p; inv[k] = pow_mod(fac[k], p - 2); for (int i = k - 1; ~i; --i) inv[i] = inv[i + 1] * (i + 1) % p; for (int i = 0; i <= n; ++i) C[i][0] = 1; for (int i = 1; i <= n; ++i) for (int j = 1; j <= i; ++j) C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % p; }
unordered_map<int, ll> mp; ll facD; voidinit(){ int fac = 1; for (int i = 1; i <= D; ++i) fac = 1ll * fac * i % p; facD = fac; for (int i = D; i <= D + n * k; ++i) { mp[i] = pow_mod(fac, p - 2); fac = 1ll * fac * (i + 1) % p; } }
ll A[10000], B[10000], tmp[10000]; int n1, n2; voidMul(ll *A, ll *B){ int n = n1 + n2; for (int k = 0; k <= n; ++k) { tmp[k] = 0; for (int i = 0; i <= min(n1, k); ++i) if (k - i <= n2) tmp[k] = (tmp[k] + A[i] * B[k - i]) % p; } for (int i = 0; i <= n; ++i) A[i] = tmp[i]; n1 = n; }
intmain(){ ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cin >> n >> k >> D; init_C(n, k); init(); if (k == 0) returncout << pow_mod(n, D) << "\n", 0; for (int i = 0; i < k; ++i) B[i] = inv[i]; n2 = k - 1; A[0] = 1; n1 = 0; ll ans = 0; for (int i = 0, type = 1; i <= n; ++i, type = -type) { ll sum = 0; for (int j = 0; j <= n1; ++j) sum = (sum + A[j] * pow_mod(n - i, D + n * k - j) % p * mp[D + n * k - j]) % p; ans = (ans + type * C[n][i] * sum) % p; Mul(A, B); } ans = ans * facD % p; cout << (ans + p) % p << "\n"; return0; }