【模板】Lucas定理

代码如下

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=1e5+10;

int p;
LL fac[maxn],inv[maxn];

LL fpow(LL a,LL b,LL mod){
	LL ret=1%mod;
	for(;b;b>>=1,a=a*a%mod)if(b&1)ret=ret*a%mod;
	return ret;
}
LL C(int n,int m){
	if(m>n)return 0;
	return fac[n]*inv[n-m]%p*inv[m]%p;
}
LL Lucas(int n,int m){
	if(m==0)return 1;
	return Lucas(n/p,m/p)*C(n%p,m%p)%p;
}

int main(){
	int T;scanf("%d",&T);
	while(T--){
		int n,m;
		scanf("%d%d%d",&n,&m,&p);
		
		fac[0]=1;
		for(int i=1;i<=p;i++)fac[i]=fac[i-1]*i%p;
		
		inv[p-1]=fpow(fac[p-1],p-2,p);
		for(int i=p-1;i>=1;i--)inv[i-1]=inv[i]*i%p;
		
		printf("%lld\n",Lucas(n+m,m));
	}
	return 0;
}
posted @ 2019-05-23 16:23  shellpicker  阅读(152)  评论(0编辑  收藏  举报