結果
| 問題 | No.3394 Big Binom |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-12-01 10:12:33 |
| 言語 | Rust (1.83.0 + proconio) |
| 結果 |
AC
|
| 実行時間 | 1,850 ms / 2,000 ms |
| コード長 | 2,193 bytes |
| 記録 | |
| コンパイル時間 | 22,733 ms |
| コンパイル使用メモリ | 399,356 KB |
| 実行使用メモリ | 7,844 KB |
| 最終ジャッジ日時 | 2025-12-01 10:13:08 |
| 合計ジャッジ時間 | 25,074 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 21 |
ソースコード
/*
元のPythonコード:
N, K = list(map(int, input().split()))
MOD = 998244353
if K > N - K:
K = N - K
ue = 1
sita = 1
for i in range(1, K + 1):
ue = (ue * (N - i + 1)) % MOD
sita = (sita * i) % MOD
sita = pow(sita, MOD - 2, MOD)
print((ue * sita) % MOD)
*/
use std::io;
use std::cmp;
// MODの定数定義
const MOD: u64 = 998244353;
// --- 補助関数 (Pythonの pow(..., MOD) の代わり) ---
/**
* 繰り返し二乗法 (Modular Exponentiation)
* (base ^ exp) % MOD を計算します。
*/
fn power(mut base: u64, mut exp: u64) -> u64 {
let mut res = 1;
base %= MOD;
while exp > 0 {
if exp % 2 == 1 {
res = (res * base) % MOD;
}
base = (base * base) % MOD;
exp /= 2;
}
res
}
/**
* モジュロ逆元 (Modular Inverse)
* フェルマーの小定理により n^(MOD-2) % MOD を計算します。
*/
fn mod_inverse(n: u64) -> u64 {
// MOD-2 乗することで逆元が得られます
power(n, MOD - 2)
}
// --- メイン処理 ---
fn main() {
// 標準入力から1行読み込み (N, K)
let mut line = String::new();
io::stdin().read_line(&mut line).expect("Failed to read line");
// N, K = list(map(int, input().split()))
let parts: Vec<u64> = line
.split_whitespace()
.filter_map(|s| s.parse().ok())
.collect();
if parts.len() < 2 {
return;
}
let n = parts[0];
let mut k = parts[1];
// if K > N - K: K = N - K
// NCK = N C(N-K) の性質を利用し、Kを小さくする
k = cmp::min(k, n - k);
// ue = 1, sita = 1
let mut ue: u64 = 1; // 分子: N * (N-1) * ... * (N-K+1)
let mut sita: u64 = 1; // 分母: K!
// for i in range(1, K + 1):
for i in 1..=k {
// ue = (ue * (N - i + 1)) % MOD
ue = (ue * (n - i + 1)) % MOD;
// sita = (sita * i) % MOD
sita = (sita * i) % MOD;
}
// sita = pow(sita, MOD - 2, MOD)
// 分母 sita の逆元を求める
let inv_sita = mod_inverse(sita);
// print((ue * sita) % MOD)
// 結果 = (分子 * 分母の逆元) % MOD
let result = (ue * inv_sita) % MOD;
println!("{}", result);
}