結果
| 問題 | No.3394 Big Binom |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-11-25 22:13:51 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
TLE
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 1,494 bytes |
| 記録 | |
| コンパイル時間 | 2,798 ms |
| コンパイル使用メモリ | 276,156 KB |
| 実行使用メモリ | 7,852 KB |
| 最終ジャッジ日時 | 2025-12-14 19:56:53 |
| 合計ジャッジ時間 | 17,825 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 19 TLE * 3 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
long long MOD = 998244353;
static const int MAXN = 2500000; // 必要に応じて大きく設定
// 階乗・階乗逆元の配列
static long long fact[MAXN+1], invFact[MAXN+1];
// 繰り返し二乗法 (a^b mod M)
long long modpow(long long a, long long b, long long M) {
long long ret = 1 % M;
a %= M;
while (b > 0) {
if (b & 1) ret = (ret * a) % M;
a = (a * a) % M;
b >>= 1;
}
return ret;
}
// 前処理: 階乗と逆元のテーブルを作る
void initFactorials() {
// 階乗テーブル
fact[0] = 1;
for (int i = 1; i <= MAXN; i++) {
fact[i] = fact[i-1] * i % MOD;
}
// 階乗逆元テーブル
invFact[MAXN] = modpow(fact[MAXN], MOD - 2, MOD); // フェルマーの小定理で逆元を計算
for (int i = MAXN; i >= 1; i--) {
invFact[i-1] = invFact[i] * i % MOD;
}
}
// 組み合わせ数 C(n, r)
long long comb(int n, int r) {
if (r < 0 || r > n) return 0;
return fact[n] * invFact[r] % MOD * invFact[n - r] % MOD;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
ll n, k;
cin >> n >> k;
ll ans = 1;
const ll mod = 998244353;
ll temp = 1;
if (k > n - k) k = n - k;
for (ll i = 1; i <= k; ++i) {
ans = ans * ((n - i + 1) % mod) % mod;
temp = temp * i % mod;
}
ans = ans * modpow(temp, mod - 2, mod) % mod;
cout << ans << '\n';
}