結果
問題 | No.1762 🐙🐄🌲 |
ユーザー | NyaanNyaan |
提出日時 | 2021-10-06 08:44:16 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 19 ms / 4,000 ms |
コード長 | 2,279 bytes |
コンパイル時間 | 788 ms |
コンパイル使用メモリ | 83,844 KB |
実行使用メモリ | 9,744 KB |
最終ジャッジ日時 | 2024-06-11 05:32:46 |
合計ジャッジ時間 | 2,179 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,812 KB |
testcase_01 | AC | 2 ms
6,940 KB |
testcase_02 | AC | 6 ms
6,944 KB |
testcase_03 | AC | 2 ms
6,944 KB |
testcase_04 | AC | 2 ms
6,940 KB |
testcase_05 | AC | 1 ms
6,940 KB |
testcase_06 | AC | 2 ms
6,940 KB |
testcase_07 | AC | 1 ms
6,944 KB |
testcase_08 | AC | 1 ms
6,944 KB |
testcase_09 | AC | 2 ms
6,944 KB |
testcase_10 | AC | 2 ms
6,948 KB |
testcase_11 | AC | 2 ms
6,940 KB |
testcase_12 | AC | 2 ms
6,940 KB |
testcase_13 | AC | 13 ms
6,940 KB |
testcase_14 | AC | 18 ms
8,532 KB |
testcase_15 | AC | 15 ms
9,600 KB |
testcase_16 | AC | 19 ms
9,744 KB |
testcase_17 | AC | 15 ms
8,828 KB |
testcase_18 | AC | 18 ms
9,660 KB |
testcase_19 | AC | 18 ms
9,560 KB |
testcase_20 | AC | 1 ms
6,940 KB |
testcase_21 | AC | 1 ms
6,940 KB |
testcase_22 | AC | 2 ms
6,944 KB |
testcase_23 | AC | 1 ms
6,944 KB |
testcase_24 | AC | 2 ms
6,940 KB |
testcase_25 | AC | 2 ms
6,940 KB |
testcase_26 | AC | 17 ms
9,304 KB |
testcase_27 | AC | 12 ms
6,940 KB |
testcase_28 | AC | 2 ms
6,940 KB |
testcase_29 | AC | 2 ms
6,940 KB |
testcase_30 | AC | 10 ms
6,940 KB |
testcase_31 | AC | 1 ms
6,940 KB |
testcase_32 | AC | 10 ms
6,944 KB |
testcase_33 | AC | 2 ms
6,940 KB |
testcase_34 | AC | 2 ms
6,940 KB |
testcase_35 | AC | 2 ms
6,940 KB |
testcase_36 | AC | 12 ms
7,124 KB |
testcase_37 | AC | 1 ms
6,940 KB |
testcase_38 | AC | 17 ms
9,308 KB |
testcase_39 | AC | 2 ms
6,944 KB |
testcase_40 | AC | 15 ms
9,736 KB |
testcase_41 | AC | 2 ms
6,944 KB |
testcase_42 | AC | 17 ms
8,540 KB |
testcase_43 | AC | 2 ms
6,940 KB |
testcase_44 | AC | 12 ms
7,124 KB |
testcase_45 | AC | 2 ms
6,944 KB |
testcase_46 | AC | 17 ms
8,536 KB |
testcase_47 | AC | 2 ms
6,940 KB |
testcase_48 | AC | 18 ms
9,568 KB |
testcase_49 | AC | 2 ms
6,940 KB |
ソースコード
#include <cassert> #include <iostream> #include <vector> #include "atcoder/modint.hpp" using namespace std; using mint = atcoder::modint998244353; struct Binomial { vector<mint> fac_, finv_, inv_; Binomial(int MAX = 0) : fac_(MAX + 10), finv_(MAX + 10), inv_(MAX + 10) { assert(mint::mod() != 0); MAX += 9; fac_[0] = finv_[0] = inv_[0] = 1; for (int i = 1; i <= MAX; i++) fac_[i] = fac_[i - 1] * i; finv_[MAX] = fac_[MAX].inv(); for (int i = MAX - 1; i > 0; i--) finv_[i] = finv_[i + 1] * (i + 1); for (int i = 1; i <= MAX; i++) inv_[i] = finv_[i] * fac_[i - 1]; } void extend() { int n = fac_.size(); mint fac = fac_.back() * n; mint inv = (-inv_[mint::mod() % n]) * (mint::mod() / n); mint finv = finv_.back() * inv; fac_.push_back(fac); finv_.push_back(finv); inv_.push_back(inv); } mint fac(int i) { if (i < 0) return mint(0); while (i >= (int)fac_.size()) extend(); return fac_[i]; } mint finv(int i) { if (i < 0) return mint(0); while (i >= (int)finv_.size()) extend(); return finv_[i]; } mint inv(int i) { if (i < 0) return mint(0); while (i >= (int)inv_.size()) extend(); return inv_[i]; } mint C(int n, int r) { if (n < 0 || n < r || r < 0) return mint(0); return fac(n) * finv(n - r) * finv(r); } }; Binomial C; using vm = vector<mint>; vm fast_pow(const vm &f, long long k, int n) { if (f.size() == 0 or n == 0) return vm(n, mint(0)); int d = f.size() - 1; vm g(n); g[0] = f[0].pow(k); mint denom = f[0].inv(); k %= mint::mod(); for (int a = 1; a < n; a++) { int ie = min(a, d); for (int i = 1; i <= ie; i++) { g[a] += f[i] * g[a - i] * ((k + 1) * i - a); } g[a] *= denom * C.inv(a); } return g; } void die() { cout << "0\n"; exit(0); } int main() { int N, P; cin >> N >> P; if (N % 4 != 1) die(); int M = (N - 1) / 4; if (3 * M + 1 < P) die(); if (M - 1 - 7 * P < 0) die(); vm H(7); for (int i = 0; i < 7; i++) H[i] = C.finv(i); mint ans = fast_pow(H, 3 * M + 1 - P, M - 7 * P)[M - 1 - 7 * P]; ans *= C.C(3 * M + 1, P) * C.fac(M - 1); ans *= (C.finv(7).pow(P)); ans *= C.fac(N) * C.inv(3 * M + 1) * C.finv(M) * (C.finv(3).pow(M)); cout << ans.val() << "\n"; }