| Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
|---|---|---|---|---|---|---|---|---|---|
| 41156 | Gapple | 【BJ】T2 | C++ | 编译错误 | 0 | 0 MS | 0 KB | 3897 | 2026-04-11 15:09:44 |
#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) { } constexpr 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 bool operator==(Modular lhs, Modular rhs) { return lhs.val == rhs.val; } 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(Modular<mod - 1> power) { Modular res = 1, base = *this; for (; power.val > 0; power.val >>= 1, base *= base) { if (power.val & 1) res *= base; } return res; } Modular inv() const { int power = mod - 2; Modular res = 1, base = val; for (; power > 0; power >>= 1, base *= base) { if (power & 1) res *= base; } return res; } constexpr friend Modular operator/(Modular lhs, Modular rhs) { return 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; } 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 istream& operator>>(istream& is, Modular& res) { char ch = is.get(); int sign = 1; res = 0; while (!isdigit(ch)) { ch = is.get(); if (ch == '-') sign = -sign; } res = ch - '0'; ch = is.get(); while (isdigit(ch)) { res = res * 10 + (ch - '0'); ch = is.get(); } res *= sign; return is; } 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> dp(2 * N + 1), one(N + 1); dp[2] = one[1] = 1; for (int i = 2; i <= N; ++i) { vector<mint> nxt(2 * N + 1); for (int j = 2; j <= 2 * N; ++j) { nxt[j + 2] += dp[j] * (j + 1) * (j + 2) * INV_2; nxt[j + 1] += dp[j] * (j + 1) * j; nxt[j] += dp[j] * 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]; vector<mint> nxt(N + 1); for (int j = 1; j <= N; ++j) nxt[j] = coeff[j] * j + coeff[j - 1]; swap(coeff, nxt); mint cur = one[i].pow(k); for (int j = 1; j <= N; ++j) cur -= coeff[j] * ans[j]; cout << (ans[i] = cur) * ifact << '\n'; } return 0; }