結果
| 問題 | No.3394 Big Binom |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-05-25 15:43:44 |
| 言語 | Rust (1.94.0 + proconio + num + itertools) |
| 結果 |
AC
|
| 実行時間 | 1,792 ms / 2,000 ms |
| コード長 | 941 bytes |
| 記録 | |
| コンパイル時間 | 970 ms |
| コンパイル使用メモリ | 187,360 KB |
| 実行使用メモリ | 6,400 KB |
| 最終ジャッジ日時 | 2026-05-25 15:43:59 |
| 合計ジャッジ時間 | 12,455 ms |
|
ジャッジサーバーID (参考情報) |
judge2_0 / judge3_0 |
| 純コード判定待ち |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 22 |
ソースコード
use proconio::input;
const MOD: u64 = 998244353;
fn modinv(a: u64, m: u64) -> u64 {
pow_mod(a, m - 2, m)
}
fn pow_mod(mut base: u64, mut exp: u64, m: u64) -> u64 {
let mut result = 1u64;
base %= m;
while exp > 0 {
if exp & 1 == 1 {
result = result * base % m;
}
base = base * base % m;
exp >>= 1;
}
result
}
// C(n, k) where n, k < MOD
fn comb_small(n: u64, k: u64) -> u64 {
if k > n { return 0; }
let k = k.min(n - k);
let mut num = 1u64;
let mut den = 1u64;
for i in 0..k {
num = num * (n - i) % MOD;
den = den * (i + 1) % MOD;
}
num * modinv(den, MOD) % MOD
}
// Lucas の定理: C(n, k) mod p
fn lucas(n: u64, k: u64) -> u64 {
if k == 0 { return 1; }
comb_small(n % MOD, k % MOD) * lucas(n / MOD, k / MOD) % MOD
}
fn main() {
input! {
n: u64,
k: u64,
}
println!("{}", lucas(n, k));
}