#include using namespace std; #include using mint = atcoder::modint998244353; namespace po167{ template struct Binomial{ std::vector fact_vec, fact_inv_vec; void extend(int m = -1){ int n = fact_vec.size(); if (m == -1) m = n * 2; if (n >= m) return; fact_vec.resize(m); fact_inv_vec.resize(m); for (int i = n; i < m; i++){ fact_vec[i] = fact_vec[i - 1] * T(i); } fact_inv_vec[m - 1] = T(1) / fact_vec[m - 1]; for (int i = m - 1; i > n; i--){ fact_inv_vec[i - 1] = fact_inv_vec[i] * T(i); } } Binomial(int MAX = 0){ fact_vec.resize(1, T(1)); fact_inv_vec.resize(1, T(1)); extend(MAX + 1); } T fact(int i){ if (i < 0) return 0; while (int(fact_vec.size()) <= i) extend(); return fact_vec[i]; } T invfact(int i){ if (i < 0) return 0; while (int(fact_inv_vec.size()) <= i) extend(); return fact_inv_vec[i]; } T C(int a, int b){ if (a < b || b < 0) return 0; return fact(a) * invfact(b) * invfact(a - b); } T inv(int a){ if (a < 0) return inv(-a) * T(-1); if (a == 0) return 1; return fact(a - 1) * invfact(a); } }; } vector solve_fast_2(int N, int P, int Q){ vector ans(N + 1); po167::Binomial table; vector tmp(N + 1); for (int i = 1; i <= N; i++){ tmp[i] = table.C(P - 1, i - 1) * table.C(Q - 1, i - 1) * table.inv(i); } vector nx(N + 1); for (int i = 0; i <= N; i++){ nx[i] = table.C(P + Q + i, i); } tmp = atcoder::convolution(tmp, nx); tmp.resize(N + 1); return tmp; } int main(){ std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int N, P, Q; cin >> N >> P >> Q; auto ans = solve_fast_2(N, P, Q); for (int i = 1; i <= N; i++){ cout << ans[i].val() << "\n"; } }