using s64 = longlong; using u64 = unsignedlonglong;
/* 取 min */ template <classT> inlinevoidchmin(T &x, const T &y){ if (x > y) { x = y; } } /* 取 max */ template <classT> inlinevoidchmax(T &x, const T &y){ if (x < y) { x = y; } }
/* ----- ----- ----- 正文 ----- ----- ----- */
constint mod = 998244353; // 模数需根据实际问题调整
/* 模意义下 加法 */ inlinevoidadd(int &x, constint &y){ x += y; if (x >= mod) { x -= mod; } } /* 模意义下 减法 */ inlinevoiddec(int &x, constint &y){ x -= y; if (x < 0) { x += mod; } } /* 模意义下 取反 */ inlinevoidneg(int &x){ if (x) { x = mod - x; } } /* 模意义下 乘法 */ inlinevoidmul(int &x, constint &y){ x = 1ll * x * y % mod; }
/* 模意义下 修正 */ inlineintnorm(int x){ x %= mod; return x < 0 ? x + mod : x; }
/* 快速幂 */ constexprintqpow(int a, int b, int p){ int ans = 1; for (; b; b >>= 1) { if (b & 1) ans = 1ll * ans * a % p; a = 1ll * a * a % p; } return ans; }
constint N = 2010;
int n, m, k;
int f[N * 2][N * 2]; int ans[N * 2];
structBinomCoef { std::vector<int> fact, facv;
voidinit(constint &n){ fact.resize(n + 1), facv.resize(n + 1); fact[0] = 1; for (int i = 1; i <= n; i ++) { fact[i] = 1ll * fact[i - 1] * i % mod; }
facv[n] = qpow(fact[n], mod - 2, mod); for (int i = n - 1; i >= 0; i --) { facv[i] = 1ll * facv[i + 1] * (i + 1) % mod; } }
intbinom(int n, int m){ if (n < m || m < 0) { return0; } return1ll * facv[m] * facv[n - m] % mod * fact[n] % mod; } } bc;
voidwork(){ std::cin >> n >> m >> k, k --;
f[0][0] = 1; for (int i = 1; i <= n + m; i ++) { for (int j = 1; j <= std::min(i, k); j ++) { f[i][j] = 0; add(f[i][j], 1ll * f[i - 1][j] * j % mod); add(f[i][j], 1ll * f[i - 1][j - 1] * (k - j + 1) % mod); } }
bc.init(std::max(n, m));
for (int i = std::min(n, m); i <= n + m - 1; i ++) { ans[i] = 0; } for (int x = 1; x <= n; x ++) { for (int y = 1; y <= m; y ++) { int cur = 1ll * bc.binom(n, x) * bc.binom(m, y) % mod * f[n + m - x - y][k] % mod; add(ans[n + m - std::max(x, y)], cur); } }
for (int i = std::min(n, m); i <= n + m - 1; i ++) { std::cout << ans[i] << ' '; } std::cout << '\n'; }