【问题描述】
计算(mn)\binom{m}{n}(nm)mod 9901的值
其中(mn)\binom{m}{n}(nm)表示m个物品选n个的方案数
【输入格式】
从文件comb.in中输入数据。
输入的第一行包含两个整数,m和n
【输出格式】
输出到文件comb.out中。
输出一行,一个整数
【样例输入】
2 1
【样例输出】
2
【数据规模与约定】
对于 20%的数据,n<=m<=20
对于 40%的数据,n<=m<=2000
对于 100%的数据,n<=m<=20000
Lucas定理板子题 冬令营时我不会Lucas只能用逆元混点分
上代码
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define N 20010
#define p 9901
using namespace std;
typedef long long LL;
LL m,n,fac[N],inv[N];
LL C(int n,int m)
{
if(n<m)return 0;
if(n<p&&m<p) return fac[n]*inv[m]%p*inv[n-m]%p;
return C(n/p,m/p)*C(n%p,m%p)%p;
}
int main()
{
scanf("%lld%lld",&m,&n);
fac[0]=1;
for(LL i=1;i<p;i++)fac[i]=fac[i-1]*i%p;
inv[1]=1;
for(LL i=2;i<=p;i++)inv[i]=(p-p/i)*inv[p%i]%p;
inv[0]=1;
for(LL i=1;i<=p;i++)inv[i]=(inv[i]*inv[i-1])%p;
cout<<C(m,n);
return 0;
}
试运行完事了 以后要认真写博客了 可能时不时还会水两篇咳咳