結果
問題 | No.2391 SAN 値チェック |
ユーザー |
![]() |
提出日時 | 2023-07-21 23:06:34 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 41 ms / 2,000 ms |
コード長 | 2,969 bytes |
コンパイル時間 | 2,180 ms |
コンパイル使用メモリ | 199,260 KB |
最終ジャッジ日時 | 2025-02-15 17:30:25 |
ジャッジサーバーID (参考情報) |
judge4 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 17 |
ソースコード
#include <bits/stdc++.h>#ifdef LOCAL#include <debug.hpp>#else#define debug(...) void(0)#endif#include "atcoder/modint"template <typename T> struct Binomial {Binomial(int MAX = 0) : n(1), facs(1, T(1)), finvs(1, T(1)), invs(1, T(1)) {while (n <= MAX) extend();}T fac(int i) {assert(i >= 0);while (n <= i) extend();return facs[i];}T finv(int i) {assert(i >= 0);while (n <= i) extend();return finvs[i];}T inv(int i) {assert(i >= 0);while (n <= i) extend();return invs[i];}T P(int n, int r) {if (n < 0 || n < r || r < 0) return T(0);return fac(n) * finv(n - r);}T C(int n, int r) {if (n < 0 || n < r || r < 0) return T(0);return fac(n) * finv(n - r) * finv(r);}T H(int n, int r) {if (n < 0 || r < 0) return T(0);return r == 0 ? 1 : C(n + r - 1, r);}T C_naive(int n, int r) {if (n < 0 || n < r || r < 0) return T(0);T res = 1;r = std::min(r, n - r);for (int i = 1; i <= r; i++) res *= inv(i) * (n--);return res;}private:int n;std::vector<T> facs, finvs, invs;inline void extend() {int m = n << 1;facs.resize(m);finvs.resize(m);invs.resize(m);for (int i = n; i < m; i++) facs[i] = facs[i - 1] * i;finvs[m - 1] = T(1) / facs[m - 1];invs[m - 1] = finvs[m - 1] * facs[m - 2];for (int i = m - 2; i >= n; i--) {finvs[i] = finvs[i + 1] * (i + 1);invs[i] = finvs[i] * facs[i - 1];}n = m;}};using namespace std;typedef long long ll;#define all(x) begin(x), end(x)constexpr int INF = (1 << 30) - 1;constexpr long long IINF = (1LL << 60) - 1;constexpr int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};template <class T> istream& operator>>(istream& is, vector<T>& v) {for (auto& x : v) is >> x;return is;}template <class T> ostream& operator<<(ostream& os, const vector<T>& v) {auto sep = "";for (const auto& x : v) os << exchange(sep, " ") << x;return os;}template <class T, class U = T> bool chmin(T& x, U&& y) { return y < x and (x = forward<U>(y), true); }template <class T, class U = T> bool chmax(T& x, U&& y) { return x < y and (x = forward<U>(y), true); }template <class T> void mkuni(vector<T>& v) {sort(begin(v), end(v));v.erase(unique(begin(v), end(v)), end(v));}template <class T> int lwb(const vector<T>& v, const T& x) { return lower_bound(begin(v), end(v), x) - begin(v); }using mint = atcoder::modint998244353;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);Binomial<mint> BINOM;int N;cin >> N;for (int i = 0; i <= N; i++) {mint ans = BINOM.finv(N - i) * mint(-i).pow(N - i);cout << ans.val() << '\n';}return 0;}