結果
問題 | No.2763 Macaron Gift Box |
ユーザー |
👑 |
提出日時 | 2024-04-27 07:54:56 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 966 ms / 3,000 ms |
コード長 | 3,476 bytes |
コンパイル時間 | 4,864 ms |
コンパイル使用メモリ | 266,476 KB |
最終ジャッジ日時 | 2025-02-21 09:13:34 |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 15 |
ソースコード
#include<bits/stdc++.h>#include<atcoder/all>#define rep(i,n) for(int i=0;i<n;i++)using namespace std;using namespace atcoder;using mint = modint998244353;// Thanks for Luzhiled-san's website// https://ei1333.github.io/luzhiled/snippets/math/formal-power-series.htmltemplate< typename T >struct FormalPowerSeries : vector< T > {using vector< T >::vector;using P = FormalPowerSeries;template<class...Args> FormalPowerSeries(Args...args): vector<T>(args...) {}FormalPowerSeries(initializer_list<T> a): vector<T>(a.begin(),a.end()) {}using MULT = function< P(P, P) >;static MULT &get_mult() {static MULT mult = [&](P a, P b){P res(convolution(a, b));return res;};return mult;}static void set_fft(MULT f) {get_mult() = f;}P operator+(const P &r) const { return P(*this) += r; }P operator+(const T &v) const { return P(*this) += v; }P operator*(const P &r) const { return P(*this) *= r; }P operator*(const T &v) const { return P(*this) *= v; }P &operator+=(const P &r) {if(r.size() > this->size()) this->resize(r.size());for(int i = 0; i < int(r.size()); i++) (*this)[i] += r[i];return *this;}P &operator+=(const T &r) {if(this->empty()) this->resize(1);(*this)[0] += r;return *this;}P &operator*=(const T &v) {const int n = (int) this->size();for(int k = 0; k < n; k++) (*this)[k] *= v;return *this;}P &operator*=(const P &r) {if(this->empty() || r.empty()) {this->clear();return *this;}assert(get_mult() != nullptr);return *this = get_mult()(*this, r);}P pre(int sz) const {return P(begin(*this), begin(*this) + min((int) this->size(), sz));}P diff() const {const int n = (int) this->size();P ret(max(0, n - 1));for(int i = 1; i < n; i++) ret[i - 1] = (*this)[i] * T(i);return ret;}P integral() const {const int n = (int) this->size();P ret(n + 1);ret[0] = T(0);for(int i = 0; i < n; i++) ret[i + 1] = (*this)[i] / T(i + 1);return ret;}// F(0) must not be 0P inv(int deg = -1) const {assert(((*this)[0]) != T(0));const int n = (int) this->size();if(deg == -1) deg = n;P ret({T(1) / (*this)[0]});for(int i = 1; i < deg; i <<= 1) {ret = (ret * T(2) + ret * ret * pre(i << 1) * T(-1)).pre(i << 1);}return ret.pre(deg);}// F(0) must be 1P log(int deg = -1) const {assert((*this)[0] == 1);const int n = (int) this->size();if(deg == -1) deg = n;return (this->diff() * this->inv(deg)).pre(deg - 1).integral();}// F(0) must be 0P exp(int deg = -1) const {assert((*this)[0] == T(0));const int n = (int) this->size();if(deg == -1) deg = n;P ret({T(1)});for(int i = 1; i < deg; i <<= 1) {ret = (ret * (pre(i << 1) + T(1) + ret.log(i << 1) * T(-1))).pre(i << 1);}return ret.pre(deg);}};using fps = FormalPowerSeries<mint>;int main(){int n, k;cin >> n >> k;assert(1 <= k && k <= n && n <= 200000);fps f(n + 1);for(int i = 1; i <= n; i++){for(int j = 1; (long long)i * j * (k + 1) <= n; j++){f[i * j * (k + 1)] -= mint(j).inv();}}for(int i = 1; i <= n; i++){for(int j = 1; i * j <= n; j++){f[i * j] += mint(j).inv();}}f = f.exp();for(int i = 1; i <= n; i++){cout << f[i].val();if(i == n) cout << "\n";else cout << " ";}return 0;}