贴个组合数取模的模板
#include <iostream>
using namespace std;
// 计算 x^y % p 使用快速幂
long long mod_exp(long long x, long long y, long long p) {
long long result = 1;
x = x % p;
while (y > 0) {
if (y % 2 == 1) {
result = (result * x) % p;
}
y = y / 2;
x = (x * x) % p;
}
return result;
}
// 计算 C(n, k) % p 的逐步方法
long long comb_mod(long long n, long long k, long long p) {
if (k > n) return 0;
if (k == 0 || k == n) return 1;
long long res = 1;
k = min(k, n - k); // 利用对称性,减少计算量
for (long long i = 0; i < k; ++i) {
res = (res * (n - i)) % p; // 分子部分
res = (res * mod_exp(i + 1, p - 2, p)) % p; // 分母部分的模逆 (用费马小定理)
}
return res;
}
int main() {
long long n, k;
const long long p = 1000000007; // 固定质数 p
// 输入 n 和 k
cin >> n >> k;
// 计算 C(n, k) % p
cout << comb_mod(n, k, p) << endl;
return 0;
}