C++: 卢卡斯定理模板 - 求组合数模质数

题目描述

给定整数 'n', 'm', 'p' 的值,求出 $C_{n + m}^n mod p$ 的值。

输入数据保证 'p' 为质数。

注: 'C' 表示组合数。

输入格式

本题有多组数据

第一行一个整数 'T',表示数据组数。

对于每组数据:

一行,三个整数 'n', 'm', 'p'。

输出格式

对于每组数据,输出一行,一个整数,表示所求的值。

样例 #1

样例输入 #1

2
1 2 5
2 1 5

样例输出 #1

3
3

提示

对于 $100%$ 的数据,$1 \leq n, m, p \leq 10^5$,$1 \leq T \leq 10$。

#include <iostream>
using namespace std;

int fac(int n, int p) {
    int res = 1;
    while (n > 1) {
        res = (res * n) % p;
        n--;
    }
    return res;
}

int pow_mod(int a, int b, int p) {
    int res = 1;
    while (b > 0) {
        if (b & 1) {
            res = (res * a) % p;
        }
        a = (a * a) % p;
        b >>= 1;
    }
    return res;
}

int lucas(int n, int m, int p) {
    int res = 1;
    while (n > 0 && m > 0) {
        int a = n % p;
        int b = m % p;
        if (a < b) {
            return 0;
        }
        res = (res * fac(a, p) * pow_mod(fac(b, p) * fac(a - b, p), p - 2, p)) % p;
        n /= p;
        m /= p;
    }
    return res;
}

int main() {
    int T;
    cin >> T;
    while (T--) {
        int n, m, p;
        cin >> n >> m >> p;
        cout << lucas(n + m, n, p) << endl;
    }
    return 0;
}

原文地址: https://www.cveoy.top/t/topic/p8uA 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录