結果
| 問題 |
No.1762 🐙🐄🌲
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-10-06 02:16:03 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,302 bytes |
| コンパイル時間 | 1,060 ms |
| コンパイル使用メモリ | 80,768 KB |
| 最終ジャッジ日時 | 2025-01-24 21:16:03 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 WA * 1 |
| other | AC * 21 WA * 26 |
ソースコード
#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)) * C.finv(M - 1 - 7 * P);
ans *= C.fac(N) * C.inv(3 * M + 1) * C.inv(M) * (C.finv(3).pow(M));
cout << ans.val() << "\n";
}