constexprint MOD = 998244353; constexprint N = 4005; // ! 注意两倍空间 longlong dp[N][N];
longlongQuickPow(longlong base, longlong pow){ longlong result = 1; while (pow) { if (pow & 1) result = result * base % MOD; base = base * base % MOD; pow >>= 1; } return result; }
intmain(){ std::ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int n; cin >> n; dp[n][0] = 1; for (int i = n - 1; i >= 0; i--) { for (int j = (n - i) * 2; j >= (i == 0 ? 2 : 0); j--) { if (i == 0) { dp[i][j] = QuickPow(j - 1, MOD - 2) * dp[i + 1][j - 2] % MOD; } else { if (j < 2) { dp[i][j] = (j + 1) * QuickPow(i + j + 1, MOD - 2) % MOD * dp[i][j + 1] % MOD; } elseif (j == (n - i) * 2) { dp[i][j] = (i + 1) * QuickPow(i + j - 1, MOD - 2) % MOD * dp[i + 1][j - 2] % MOD; } else { dp[i][j] = ((i + 1) * QuickPow(i + j - 1, MOD - 2) % MOD * dp[i + 1][j - 2] % MOD + (j + 1) * QuickPow(i + j + 1, MOD - 2) % MOD * dp[i][j + 1] % MOD) % MOD; } } } } #ifndef OnlineJudge for (int i = 0; i <= n; i++) { for (int j = 0; j <= 2 * (n - i); j++) { cout << dp[i][j] << ' '; } cout << '\n'; } #endif longlong answer = 0; for (int i = 1; i <= n * 2; i++) { answer = (answer + (3 * n - i) * dp[0][i] % MOD) % MOD; } cout << answer << '\n'; return0; }