結果

問題 No.3394 Big Binom
コンテスト
ユーザー SnowBeenDiding
提出日時 2026-01-05 06:43:45
言語 C++23
(gcc 15.2.0 + boost 1.89.0)
結果
AC  
実行時間 333 ms / 2,000 ms
コード長 2,954 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 6,261 ms
コンパイル使用メモリ 380,496 KB
実行使用メモリ 7,848 KB
最終ジャッジ日時 2026-01-05 06:43:55
合計ジャッジ時間 9,951 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 = 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 fact(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();
    }

    mint comb(long long n, long long k) {
        if (k < 0 || k > n) return 0;
        if (n - k < k) k = n - k;
        long long l = n - k, r = n;
        if (l / mod != r / mod) return 0;
        l %= mod;
        r %= mod;
        mint ret = (long long)fact(r);
        ret /= (long long)fact(l);
        ret /= (long long)fact(k);
        return ret;
    }

    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 = (int)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;
        }
    }
};

void solve() {
    ll n, m;
    cin >> n >> m;
    cout << BigFact().comb(n, m).val() << "\n";
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    solve();
}
0