方案统计
题目链接:ybt高效进阶6-4-2
题目大意
给你 n,m,要你求 C^m_n%10007 的值。
思路
发现
n
,
m
n,m
n,m 超大,模数很小而且是质数。
然后就直接用 Lucas 定理搞就可以了。
代码
#include<cstdio>
#define mo 10007
#define ll long long
using namespace std;
int T;
ll jc[10008], inv[10008], n, m;
ll ksm(ll x, ll y) {
ll re = 1;
while (y) {
if (y & 1) re = (re * x) % mo;
x = (x * x) % mo;
y >>= 1;
}
return re;
}
ll C(ll n, ll m) {
if (n > m) return 0;
return (jc[m] * inv[n] % mo * inv[m - n]) % mo;
}
ll work(ll n, ll m) {//Lucas定理
if (!n) return 1;
return C(n % mo, m % mo) * work(n / mo, m / mo) % mo;
}
int main() {
jc[0] = 1;//预处理出阶乘和阶乘的逆元
for (int i = 1; i <= mo; i++)
jc[i] = (jc[i - 1] * i) % mo;
inv[mo - 1] = ksm(jc[mo - 1], mo - 2);
for (int i = mo - 2; i >= 0; i--)
inv[i] = (inv[i + 1] * (i + 1)) % mo;
scanf("%d", &T);
while (T--) {
scanf("%lld %lld", &n, &m);
printf("%lld\n", work(m, n));
}
return 0;
}