#include #include using namespace std; using mint = atcoder::modint998244353; int main(){ ios::sync_with_stdio(false); cin.tie(0); // 入力を受け取る int n; cin >> n; // 2項係数を前計算 vector binom(n + 1); binom[0] = 1; for(int i = 1; i <= n; i++){ for(int j = i - 1; j >= 0; j--) binom[j + 1] += binom[j]; } // i人でじゃんけんしたときに引き分けでない手の出し方が何通りあるかの逆数 vector ndraw_inv(n + 1); mint pow2 = 2; for(int i = 2; i <= n; i++){ pow2 += pow2; ndraw_inv[i] = (pow2 - 2).inv(); } // 残り1人になるまでに i を経由する確率 dp[i] vector dp(n + 1); dp[n] = 1; // 期待値 vector ans(n + 1); mint tot = 0, pow3 = mint(3).pow(n - 1), div = mint(3).inv(); for(int i = n; i >= 2; i--){ ans[i] = tot; mint coef = ndraw_inv[i] * dp[i]; // iを経由する確率と引き分け状態を脱出するまでの期待値の積を取る tot += pow3 * coef; pow3 *= div; // 減る人数をjとしてループを回す for(int j = 1; j <= i - 1; j++){ // i 人から j 人の敗者を選ぶ // (グー、チョキ), (チョキ、パー), (パー、グー)の3通り dp[i - j] += binom[j] * coef; binom[j] -= binom[j - 1]; } } ans[1] = tot; // 答えを出力 for(int i = 1; i <= n; i++){ cout << ans[i].val() << (i == n ? '\n' : ' '); } }