/** 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) **/ #include #include // for std::min using namespace std; // MODの定義 const long long MOD = 998244353; /** * @brief 繰り返し二乗法(Modular Exponentiation) * @param base 基数 (a) * @param exp 指数 (b) * @param mod 法 (M) * @return (base ^ exp) % mod */ long long power(long long base, long long exp) { long long res = 1; base %= MOD; while (exp > 0) { if (exp % 2 == 1) { // 奇数の場合 res = (res * base) % MOD; } base = (base * base) % MOD; exp /= 2; } return res; } /** * @brief モジュロ逆元(Modular Inverse) * @param n 逆元を求めたい数 * @return n の MOD を法とする逆元 (n^(MOD-2) % MOD) */ long long modInverse(long long n) { // フェルマーの小定理により、a^(MOD-2) が逆元となる return power(n, MOD - 2); } int main() { // 入力の読み込み int N, K; if (!(cin >> N >> K)) return 0; // 二項係数 NCK = N! / (K! * (N-K)!) を計算する // NCK = (N * (N-1) * ... * (N-K+1)) / K! // K > N - K の場合、NCK = N C(N-K) の性質を利用して K を小さくする if (K > N - K) { K = N - K; } // 分子 (numerator) と分母 (denominator) long long ue = 1; // N * (N-1) * ... * (N-K+1) long long sita = 1; // K! = K * (K-1) * ... * 1 for (int i = 1; i <= K; ++i) { // 分子を計算: ue = (ue * (N - i + 1)) % MOD // N - i + 1 は N から始まり、N-1, N-2, ... と続く ue = (ue * (N - i + 1)) % MOD; // 分母を計算: sita = (sita * i) % MOD // i は 1 から K まで sita = (sita * i) % MOD; } // 分母 sita の逆元を求める long long inv_sita = modInverse(sita); // 最終結果 = (分子 * 分母の逆元) % MOD long long result = (ue * inv_sita) % MOD; cout << result << endl; return 0; }