title

卢卡斯定理

#include<cstdio>
#include<cctype>
#define int long long
using namespace std;
const int N =1e5+10;
int t,n,m,p;
int a[N],b[N];//两个非负整数 
inline int read(){
	int f=0,x=0;
	char ch=getchar();
	while(!isdigit(ch)) f|=(ch=='-'),ch=getchar();
	while(isdigit(ch)) 	x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return f?-x:x;
}
inline int lucas(int x,int y){
	if(x<y)	return 0;
	else if(x<p)	return b[x]*a[y]*a[x-y]%p;
	else	return lucas(x/p,y/p)*lucas(x%p,y%p)%p;
}
signed main(){
	t=read();
	for(register int o=1;o<=t;++o){
		n=read(),m=read(),p=read();
		a[0]=a[1]=b[0]=b[1]=1;
		for(register int i=2;i<=n+m;++i)	b[i]=b[i-1]*i%p;
		for(register int i=2;i<=n+m;++i)	a[i]=((-p/i*a[p%i])%p+p)%p;
		for(register int i=2;i<=n+m;++i)	a[i]=a[i-1]*a[i]%p;
		printf("%lld\n",lucas(n+m,m)); 
	}
	return 0;
}
//C(n,m+n)%p=C(n%p,(n+m)%p)*C(n/p,(n+m)/p)%p;
posted @ 2018-09-10 01:25  Horrigue_JyowYang  阅读(84)  评论(0编辑  收藏  举报