結果
問題 | No.2763 Macaron Gift Box |
ユーザー | eve__fuyuki |
提出日時 | 2024-05-17 23:32:30 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 1,742 ms / 3,000 ms |
コード長 | 4,792 bytes |
コンパイル時間 | 4,249 ms |
コンパイル使用メモリ | 248,848 KB |
実行使用メモリ | 17,896 KB |
最終ジャッジ日時 | 2024-05-17 23:32:46 |
合計ジャッジ時間 | 13,450 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,816 KB |
testcase_01 | AC | 2 ms
6,944 KB |
testcase_02 | AC | 2 ms
6,944 KB |
testcase_03 | AC | 2 ms
6,940 KB |
testcase_04 | AC | 1 ms
6,940 KB |
testcase_05 | AC | 1 ms
6,940 KB |
testcase_06 | AC | 2 ms
6,944 KB |
testcase_07 | AC | 734 ms
10,124 KB |
testcase_08 | AC | 146 ms
6,940 KB |
testcase_09 | AC | 367 ms
6,944 KB |
testcase_10 | AC | 1,653 ms
17,176 KB |
testcase_11 | AC | 1,641 ms
17,384 KB |
testcase_12 | AC | 1,742 ms
17,768 KB |
testcase_13 | AC | 1,705 ms
17,896 KB |
testcase_14 | AC | 147 ms
6,944 KB |
testcase_15 | AC | 146 ms
6,940 KB |
testcase_16 | AC | 151 ms
6,944 KB |
ソースコード
#include <bits/stdc++.h> #include <atcoder/convolution> #include <atcoder/modint> using namespace std; using namespace atcoder; using mint = modint998244353; void fast_io() { ios_base::sync_with_stdio(false); cin.tie(nullptr); } class FPS { using vec = vector<mint>; public: vec f; // constructor FPS() { f = {0}; } FPS(int n) { f = vec(n, 0); } FPS(vec a) { f = a; } FPS(vector<int> &a) { f = vector<mint>(a.size()); for (int i = 0; i < a.size(); i++) { f[i] = a[i]; } } FPS(const FPS &a) { f = a.f; } // useful unary operator mint &operator[](int n) { return f[n]; } int size() { return (int)f.size(); } void resize(int n) { f.resize(n); } FPS &operator+=(const FPS &rhs) { auto r = rhs.f; if (r.size() > f.size()) { f.resize(r.size()); } for (int i = 0; i < (int)r.size(); i++) { f[i] += r[i]; } return *this; } FPS &operator+=(const mint &r) { if (f.empty()) { f.resize(1); } f[0] += r; return *this; } FPS &operator-=(const FPS &rhs) { auto r = rhs.f; if (r.size() > f.size()) { f.resize(r.size()); } for (int i = 0; i < (int)r.size(); i++) { f[i] -= r[i]; } return *this; } FPS &operator-=(const mint &r) { if (f.empty()) { f.resize(1); } f[0] -= r; return *this; } FPS &operator*=(const FPS &rhs) { f = convolution(f, rhs.f); return *this; } FPS &operator*=(const mint &r) { for (int i = 0; i < f.size(); i++) { f[i] *= r; } return *this; } FPS &operator/=(const mint &r) { assert(r != 0); for (int i = 0; i < f.size(); i++) { f[i] /= r; } return *this; } FPS operator+(const FPS &r) const { return FPS(*this) += r; } FPS operator+(const mint &v) const { return FPS(*this) += v; } FPS operator-(const FPS &r) const { return FPS(*this) -= r; } FPS operator-(const mint &v) const { return FPS(*this) -= v; } FPS operator*(const FPS &r) const { return FPS(*this) *= r; } FPS operator*(const mint &v) const { return FPS(*this) *= v; } FPS operator/(const mint &v) const { return FPS(*this) /= v; } FPS operator-() const { FPS ret(f.size()); for (int i = 0; i < f.size(); i++) { ret[i] = -f[i]; } return ret; } FPS inv(int n = -1) const { assert(f[0] != 0); FPS ret(1); ret[0] = f[0].inv(); if (n == -1) { n = f.size(); } int sz = 1; while (ret.size() < n) { ret = -ret * ((*this) * ret - mint::raw(2)); sz *= 2; ret.resize(sz); } ret.resize(n); return ret; } FPS &operator/=(FPS &rhs) { f = convolution(f, rhs.inv().f); return *this; } FPS operator/(FPS &r) const { return FPS(*this) /= r; } FPS diff() const { FPS ret(f.size() - 1); for (int i = 0; i < f.size() - 1; i++) { ret[i] = f[i + 1] * (i + 1); } return ret; } FPS integral(mint c = mint::raw(0)) const { FPS ret(f.size() + 1); ret[0] = c; for (int i = 0; i < f.size(); i++) { ret[i + 1] = f[i] / (i + 1); } return ret; } FPS log(int deg = -1) const { assert(f[0] == 1); if (deg == -1) { deg = f.size(); } auto ret = this->diff() * this->inv(deg); ret.resize(deg - 1); return ret.integral(); } FPS exp(int deg = -1) const { assert(f[0] == 0); if (deg == -1) { deg = f.size(); } FPS ret(1); ret[0] = 1; int sz = 1; while (ret.size() < deg) { sz *= 2; ret = ret * ((*this) + mint::raw(1) - ret.log(sz)); ret.resize(sz); } ret.resize(deg); return ret; } }; int main() { fast_io(); int n, k; cin >> n >> k; vector<mint> inv(n + 1); for (int i = 1; i <= n; i++) { inv[i] = mint(i).inv(); } FPS logf(n + 1); for (int i = 1; i <= n; i++) { for (int j = 1; j <= n / i; j++) { logf[i * j] += inv[j]; } } FPS f = logf.exp(n + 1); FPS finv = f.inv(n + 1); // g = finv(x ^ (k + 1)) FPS g(n + 1); for (int i = 0; i <= n / (k + 1); i++) { g[i * (k + 1)] = finv[i]; } f *= g; for (int i = 1; i <= n; i++) { cout << f[i].val() << (i == n ? "\n" : " "); } return 0; }