题解:AcWing 886 求组合数 II

【题目来源】

AcWing:886. 求组合数 II - AcWing题库

【题目描述】

给定 \(n\) 组询问,每组询问给定两个整数 \(a,b\),请你输出 \(C_a^b\ mod\ (10^9+7)\) 的值。

【输入】

第一行包含整数 \(n\)

接下来 \(n\) 行,每行包含一组 \(a\)\(b\)

【输出】

\(n\) 行,每行输出一个询问的解。

【输入样例】

3
3 1
5 3
2 2

【输出样例】

3
10
1

【解题思路】

image

【算法标签】

《AcWing 886 求组合数II》 #组合数学# #组合计数# #逆元# #快速幂# #费马小定理#

【代码详解】

#include <bits/stdc++.h>
using namespace std;

typedef long long LL; // 定义 LL 为 long long 类型
const int N = 100005, mod = 1e9 + 7; // 定义常量 N 和 mod
LL fact[N], infact[N]; // fact 数组存储阶乘,infact 数组存储阶乘的逆元
int n; // 定义整数 n,表示查询的次数

// 快速幂函数,计算 a^b % p
int qmi(int a, int b, int p)
{
    LL res = 1; // 初始化结果为 1
    while (b) { // 当 b 大于 0 时循环
        if (b & 1) res = res * a % p; // 如果 b 的最低位为 1,更新结果
        a = (LL)a * a % p; // 更新 a
        b >>= 1; // 右移 b
    }
    return res; // 返回结果
}

int main()
{
    // 预处理阶乘和阶乘的逆元
    fact[0] = infact[0] = 1; // 初始化 0 的阶乘和逆元为 1
    for (int i = 1; i < N; i++) { // 遍历 1 到 N-1
        fact[i] = fact[i - 1] * i % mod; // 计算阶乘
        infact[i] = infact[i - 1] * qmi(i, mod - 2, mod) % mod; // 计算阶乘的逆元
    }

    cin >> n; // 输入查询的次数 n
    while (n--) { // 遍历每个查询
        int a, b; // 定义整数 a 和 b
        cin >> a >> b; // 输入 a 和 b
        // 计算组合数 C(a, b) = fact[a] * infact[b] % mod * infact[a - b] % mod
        cout << fact[a] * infact[b] % mod * infact[a - b] % mod << endl; // 输出结果
    }
    return 0; // 程序结束
}

【运行结果】

3
3 1
3
5 3
10
2 2
1
posted @ 2026-02-24 22:21  团爸讲算法  阅读(1)  评论(0)    收藏  举报