#include <bits/stdc++.h>
using namespace std;
const int mod = 998244353;
int add() { return 0; }
template<typename... M>
int add(int a, M... b) {
int x = add(b...);
return a + x - mod * (a + x >= mod);
}
int mul() { return 1; }
template<typename... M>
int mul(int a, M... b) {
return int(1ll * a * mul(b...) % mod);
}
int pwr(int a, long long x) {
return (x ? mul(pwr(mul(a, a), x >> 1), (x & 1 ? a : 1)) : 1);
}
int inv(int a) {
return pwr(a, mod - 2);
}
int sub(int a, int b) {
return a - b + mod * (a < b);
}
void inc(int &a, int b) {
a = add(a, b);
}
void dec(int &a, int b) {
a = sub(a, b);
}
vector<int> fact = {1}, invf = {1};
int C(int n, int k) {
if (n < k or 0 > k) return 0;
while (fact.size() <= n) {
fact.push_back(mul(fact.back(), fact.size()));
invf.push_back(inv(fact.back()));
}
return mul(fact[n], invf[k], invf[n - k]);
}
const int N = 3005;
int dp[N][N];
const int i2 = inv(2);
int main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int n;
cin >> n;
dp[0][0] = 1;
for (int k = 1; k < n; ++k) {
int a = i2, b = 0;
for (int i = 1; i <= k; ++i) {
a = mul(a, i2);
b = mul(i2, add(b, dp[i - 1][k - i]));
}
dp[k][0] = mul(b, inv(sub(1, a)));
dp[0][k] = mul(dp[k][0], i2);
for (int i = 1; i < k; ++i) {
dp[i][k - i] = mul(i2, add(dp[i - 1][k - i + 1], dp[i - 1][k - i]));
}
}
for (int i = 0; i < n; ++i) cout << dp[i][n - i - 1] << ' ';
cout << '\n';
return 0;
}
Main.cpp: In function ‘int C(int, int)’:
Main.cpp:46:22: warning: comparison of integer expressions of different signedness: ‘std::vector<int>::size_type’ {aka ‘long unsigned int’} and ‘int’ [-Wsign-compare]
46 | while (fact.size() <= n) {
| ~~~~~~~~~~~~^~~~