#include #include #include using namespace __gnu_pbds; using namespace std; #define int int64_t template using ordered_set = tree, rb_tree_tag, tree_order_statistics_node_update>; #define pi pair #define vi vector #define pb push_back #define all(x) (x).begin(), (x).end() template istream &operator>>(istream &in, vector &v) { for (auto &x : v) in >> x; return in; } template ostream &operator<<(ostream &out, const vector &v) { for (const auto &x : v) out << x << ' '; return out; } template istream &operator>>(istream &in, pair &p) { in >> p.first >> p.second; return in; } template ostream &operator<<(ostream &out, const pair &p) { out << p.first << ' ' << p.second; return out; } const int MOD = 998244353; const int N = 200001; int factorial[N], invfactorial[N]; int power(int a, int b) { int res = 1; a %= MOD; while (b > 0) { if (b & 1) res = (res * a) % MOD; a = (a * a) % MOD; b >>= 1; } return res; } void fill_factorial() { factorial[0] = 1; for (int i = 1; i < N; i++) factorial[i] = (factorial[i - 1] * i) % MOD; invfactorial[N - 1] = power(factorial[N - 1], MOD - 2) % MOD; for (int i = N - 1; i > 0; i--) invfactorial[i - 1] = (invfactorial[i] * i) % MOD; invfactorial[0] = 1; } int nCr(int n, int r) { int ans = factorial[n]; ans = (ans * invfactorial[r]) % MOD; ans = (ans * invfactorial[n - r]) % MOD; return ans; } void solve() { fill_factorial(); int n; cin >> n; for (int i = 0; i <= n; i++) { if (n % 2 == i % 2 && i == 0) cout << nCr(n, n / 2) % MOD << " "; else if ((n - i) % 2 == 0) cout << (nCr(n, (n + i) / 2) + nCr(n, (n - i) / 2)) % MOD << " "; else cout << "0 "; } cout << '\n'; } int32_t main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int t = 1; while (t--) solve(); return 0; }