题目
组合数,快速幂
思路
这是一道数学题,由之前的数学知识可以知道,题目要我们算一个数: ( C k m a n b m ) m o d 10007 (C_k^ma^nb^m)\mod\ 10007 (Ckmanbm)mod 10007
题意很明显,没有弯弯绕,就是要求这个数!可以知道,这个数由一个组合数和两个幂相乘,幂运算很好求,使用快速幂即可,组合数的求法有很多,这里记录卢卡斯定理(见字符串)
代码
#include <stdio.h>
#define MOD 10007
typedef long long LL;
// 老朋友:快速幂
int quick_pow(int a, int b, int p) {
int res = 1;
while (b) {
if (b & 1) {
res = (LL)res * a % p;
}
a = (LL)a * a % p;
b >>= 1;
}
return res;
}
// 求 a 在模 p 条件下的逆元,要求 a 与 p 互质
int inv(int a, int p) { return quick_pow(a, p - 2, p); }
// 卢卡斯定理求组合数 C(n,m) % p 的值
int lucas(int n, int m, int p) {
if (!m) return 1;
int ni = n % p, mi = m % p;
if (ni < mi) return 0;
int res = 1;
for (int i = 0; i < mi; i++) {
res = (LL)res * (ni - i) % p * inv(i + 1, p) % p;
}
return res * lucas(n / p, m / p, p) % p;
}
int main(void) {
int a = 0, b = 0, k = 0, n = 0, m = 0;
scanf("%d%d%d%d%d", &a, &b, &k, &n, &m);
printf("%d\n", (lucas(k, m, MOD) * quick_pow(a, n, MOD)) % MOD *
quick_pow(b, m, MOD) % MOD);
return 0;
}