結果

問題 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
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 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
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#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;
}
0