提交时间:2026-04-11 15:31:56
运行 ID: 41173
#pragma GCC optimize("Ofast,no-stack-protector,inline,fast-math,unroll-loops,omit-frame-pointer") #define NDEBUG #include <iostream> #include <numeric> #include <utility> #include <vector> using namespace std; using u64 = unsigned long long; template <int mod> struct Modular { int val; constexpr Modular() : val(0) { } constexpr Modular(u64 x) : val(x % mod) { } static Modular raw(int x) { if (x < 0) x += mod; else if (x >= mod) x -= mod; Modular res; res.val = x; return res; } constexpr friend Modular operator+(Modular lhs, Modular rhs) { return raw(lhs.val + rhs.val); } constexpr friend Modular operator-(Modular lhs, Modular rhs) { return raw(lhs.val - rhs.val); } constexpr Modular operator-() const { return raw(mod - val); } constexpr friend Modular operator*(Modular lhs, Modular rhs) { return u64(lhs.val) * rhs.val; } Modular pow(int power) { Modular res = 1, base = *this; for (; power > 0; power >>= 1, base *= base) { if (power & 1) res *= base; } return res; } constexpr friend Modular& operator+=(Modular& lhs, Modular rhs) { return lhs = lhs + rhs; } constexpr friend Modular& operator-=(Modular& lhs, Modular rhs) { return lhs = lhs - rhs; } constexpr friend Modular& operator*=(Modular& lhs, Modular rhs) { return lhs = lhs * rhs; } friend ostream& operator<<(ostream& os, Modular res) { return os << res.val; } }; constexpr int MOD = 998244353; using mint = Modular<MOD>; constexpr mint INV_2 = 499122177; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int N, k; cin >> N >> k; vector<mint> nxt, dp(2 * N + 1), one(N + 1); dp[2] = one[1] = 1; for (int i = 2; i <= N; ++i) { nxt.assign(2 * N + 1, 0); for (int j = 2; j <= 2 * i; ++j) { mint cur = dp[j]; if (dp[j].val == 0) continue; nxt[j + 2] += cur * (j + 1) * (j + 2) * INV_2; nxt[j + 1] += cur * (j + 1) * j; nxt[j] += cur * j * (j - 1) * INV_2; } swap(dp, nxt); one[i] = accumulate(dp.begin(), dp.end(), mint { }); } vector<mint> ans(N + 1), coeff(N + 1), inv(N + 1); // coeff[i][j]:把 i 个球放入 j 个箱子 ans[1] = coeff[1] = inv[1] = 1; cout << "1\n"; mint ifact = 1; for (int i = 2; i <= N; ++i) { inv[i] = (MOD - MOD / i) * inv[MOD % i]; ifact *= inv[i]; nxt.assign(N + 1, 0); for (int j = 1; j <= i; ++j) nxt[j] = coeff[j] * j + coeff[j - 1]; swap(coeff, nxt); mint cur = one[i].pow(k); for (int j = 1; j < i; ++j) cur -= coeff[j] * ans[j]; cout << (ans[i] = cur) * ifact << '\n'; } return 0; }