| Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
|---|---|---|---|---|---|---|---|---|---|
| 38843 | Gapple | 【S】T4 | C++ | 编译错误 | 0 | 0 MS | 0 KB | 5613 | 2025-11-06 19:14:01 |
#include <algorithm> #include <iostream> #include <vector> using namespace std; using i64 = long long; template <int mod> struct Modular { int val; Modular(i64 num = 0) : val((num % mod + mod) % mod) { } friend Modular operator+(const Modular& lhs, const Modular& rhs) { return lhs.val + rhs.val; } friend Modular operator-(const Modular& lhs, const Modular& rhs) { return lhs.val - rhs.val; } friend Modular operator*(const Modular& lhs, const Modular& rhs) { return i64(lhs.val) * rhs.val; } friend Modular operator^(Modular base, Modular<mod - 1> power) { Modular res = 1; for (; power.val > 0; power.val >>= 1, base *= base) { if (power.val & 1) res *= base; } return res; } Modular operator~() const { int power = mod - 2; Modular res = 1, base = val; for (; power > 0; power >>= 1, base *= base) { if (power & 1) res *= base; } return res; } friend Modular operator/(const Modular& lhs, const Modular& rhs) { return lhs * ~rhs; } friend Modular& operator+=(Modular& lhs, const Modular& rhs) { return lhs = lhs + rhs; } friend Modular& operator-=(Modular& lhs, const Modular& rhs) { return lhs = lhs - rhs; } friend Modular& operator*=(Modular& lhs, const Modular& rhs) { return lhs = lhs * rhs; } friend Modular& operator/=(Modular& lhs, const Modular& rhs) { return lhs = lhs / rhs; } friend Modular& operator^=(Modular& lhs, const Modular<mod - 1>& rhs) { return lhs = lhs ^ rhs; } friend bool operator==(const Modular& lhs, const Modular& rhs) { return lhs.val == rhs.val; } friend bool operator!=(const Modular& lhs, const Modular& rhs) { return lhs.val != rhs.val; } 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(); } return is; } friend ostream& operator<<(ostream& os, const Modular& res) { return os << res.val; } }; constexpr int N = 3000, MOD = 998244353; using mint = Modular<MOD>; template <class T> struct Poly { Poly(int degree = 0) : deg(degree) , terms(degree + 1) { } void set_deg(int new_deg, T coeff = 0) { deg = new_deg; terms.resize(new_deg + 1, coeff); } int get_deg() const { return deg; } vector<T> get_coeff() const { return terms; } T& operator[](int power) { return terms[power]; } const T& operator[](int power) const { return terms[power]; } friend Poly operator+(const Poly& lhs, const Poly& rhs) { Poly res(max(lhs.get_deg(), rhs.get_deg()) + 1); for (int i = 0; i <= lhs.get_deg(); ++i) { if (lhs[i] != 0) res[i] += lhs[i]; } for (int i = 0; i <= rhs.get_deg(); ++i) { if (rhs[i] != 0) res[i] += rhs[i]; } return res; } friend Poly operator-(const Poly& lhs, const Poly& rhs) { Poly res(max(lhs.get_deg(), rhs.get_deg())); for (int i = 0; i <= lhs.get_deg(); ++i) { if (lhs[i] != 0) res[i] += lhs[i]; } for (int i = 0; i <= rhs.get_deg(); ++i) { if (rhs[i] != 0) res[i] -= rhs[i]; } return res; } Poly operator-() const { return Poly() - *this; } friend Poly operator*(const Poly& lhs, const Poly& rhs) { Poly res(lhs.get_deg() + rhs.get_deg()); for (int i = 0; i <= lhs.get_deg(); ++i) { if (lhs[i] == 0) continue; for (int j = 0; j <= rhs.get_deg(); ++j) { if (rhs[j] != 0) res[i + j] += lhs[i] * rhs[j]; } } return res; } friend Poly& operator+=(Poly& lhs, const Poly& rhs) { return lhs = lhs + rhs; } friend Poly& operator-=(Poly& lhs, const Poly& rhs) { return lhs = lhs - rhs; } friend Poly& operator*=(Poly& lhs, const Poly& rhs) { return lhs = lhs * rhs; } private: int deg; vector<T> terms; }; mint inv[N + 1], fact[N + 1], ifact[N + 1]; void prepare() { inv[1] = fact[0] = fact[1] = ifact[0] = ifact[1] = 1; for (int i = 2; i <= N; ++i) { inv[i] = inv[MOD % i] * (-MOD / i); fact[i] = fact[i - 1] * i; ifact[i] = ifact[i - 1] * inv[i]; } } Poly<mint> g; mint solve(int n, int k) { Poly<mint> f(n); for (int i = k; i <= n; i += k) f[i] = ifact[i] ^ n; f = -f; auto ans = g; Poly pow_f(f); for (int i = 0; i < (n + k - 1) / k; ++i) { ans += g * pow_f; pow_f *= f; } return (mint(-1) ^ ((n + k - 1) / k - 1)) * (fact[n] ^ n) * ans[n]; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int n, l, r; cin >> n >> l >> r; g.set_deg(n); prepare(); for (int i = 1; i <= n; ++i) g[i] = ifact[i] ^ n; for (int i = l; i <= r; ++i) cout << solve(n, i) << ' '; return 0; }