結果
| 問題 | No.3394 Big Binom |
| コンテスト | |
| ユーザー |
SnowBeenDiding
|
| 提出日時 | 2025-12-01 08:51:28 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 163 ms / 2,000 ms |
| コード長 | 2,922 bytes |
| 記録 | |
| コンパイル時間 | 5,244 ms |
| コンパイル使用メモリ | 335,144 KB |
| 実行使用メモリ | 7,848 KB |
| 最終ジャッジ日時 | 2025-12-14 20:00:24 |
| 合計ジャッジ時間 | 7,438 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 22 |
ソースコード
#include <bits/stdc++.h>
#include <atcoder/all>
#define rep(i, a, b) for (ll i = (ll)(a); i < (ll)(b); i++)
using namespace atcoder;
using namespace std;
typedef long long ll;
using mint = atcoder::modint998244353;
struct BigFact {
long long mod;
using mint = modint;
BigFact(long long mod = 998244353) : mod(mod) { mint::set_mod(mod); }
vector<long long> uku = {
1, 295201906, 160030060, 957629942, 545208507, 213689172,
760025067, 939830261, 506268060, 39806322, 808258749, 440133909,
686156489, 741797144, 390377694, 12629586, 544711799, 104121967,
495867250, 421290700, 117153405, 57084755, 202713771, 675932866,
79781699, 956276337, 652678397, 35212756, 655645460, 468129309,
761699708, 533047427, 287671032, 206068022, 50865043, 144980423,
111276893, 259415897, 444094191, 593907889, 573994984, 892454686,
566073550, 128761001, 888483202, 251718753, 548033568, 428105027,
742756734, 546182474, 62402409, 102052166, 826426395, 159186619,
926316039, 176055335, 51568171, 414163604, 604947226, 681666415,
511621808, 924112080, 265769800, 955559118, 763148293, 472709375,
19536133, 860830935, 290471030, 851685235, 242726978, 169855231,
612759169, 599797734, 961628039, 953297493, 62806842, 37844313,
909741023, 689361523, 887890124, 380694152, 669317759, 367270918,
806951470, 843736533, 377403437, 945260111, 786127243, 80918046,
875880304, 364983542, 623250998, 598764068, 804930040, 24257676,
214821357, 791011898, 954947696, 183092975};
long long solve(long long n) {
if (n >= mod) return 0;
int am = n % 10000000;
int ka = n / 10000000 * 10000000;
mint ret = uku[n / 10000000];
for (int i = ka + 1; i <= ka + am; i++) ret *= i;
return ret.val();
}
void uku_make(long long mod) {
mint::set_mod(mod);
mint now = 1;
vector<long long> uki;
rep(i, 1, mod) {
if ((i - 1) % 10000000 == 0) uki.push_back(now.val());
now *= i;
}
cout << '{';
int m = uki.size();
for (int i = 0; i < m; i++) {
if (i % 10 == 0) cout << endl;
if (i != m - 1)
cout << uki[i] << ',';
else
cout << uki[i] << "};" << endl;
}
}
};
mint comb(ll n, ll k, int mod = 998244353) {
if (k < 0 || k > n) return 0;
BigFact bf;
if (n - k < k) k = n - k;
ll l = n - k, r = n;
if (l / mod != r / mod) return 0;
l %= mod;
r %= mod;
mint ret = bf.solve(r);
ret /= bf.solve(l);
ret /= bf.solve(k);
return ret;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout << fixed << setprecision(12);
ll n, k;
cin >> n >> k;
mint ans = comb(n, k);
cout << ans.val() << endl;
}
SnowBeenDiding