大江东去,浪淘尽,千古风流人物。故垒西边,人道是,三国周郎赤壁。乱石穿空,惊涛拍岸,卷起千堆雪。江山如画,一时多少豪杰。遥想公瑾当年,小乔初嫁了,雄姿英发。羽扇纶巾,谈笑间,樯橹灰飞烟灭。故国神游,多情应笑我,早生华发。人生如梦,一尊还酹江月。

P3807 【模板】卢卡斯定理

#include<bits/stdc++.h>
using namespace std;

#define go(i,a,b) for(int i=a;i<=b;++i)
#define int long long
typedef long long ll;

const int N=1e5+10;

#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[1<<21],*p1=buf,*p2=buf;
int n,m,mod,jc[N],inv[N];

template<typename T> inline void read(T &x){
	x=0;char f=1,c=getchar();
	while(!isdigit(c)){ if(c=='-') f=-1; c=getchar(); }
	while(isdigit(c)){ x=x*10+c-'0'; c=getchar(); }
	x*=f;
}

int qpow(int x,int p){
	int ans=1;
	for(;p;p>>=1){
		if(p&1) ans=ans*x%mod;
		x=x*x%mod;
	}
	return ans;
}

int C(int n,int m){
	if(m>n) return 0;
	return jc[n]*inv[m]%mod*inv[n-m]%mod;
}

int lucas(int n,int m){
	if(!m) return 1;
	return lucas(n/mod,m/mod)*C(n%mod,m%mod)%mod;
}

signed main(){
	//freopen("input.txt","r",stdin);
	int T;read(T);
	jc[0]=1;inv[0]=1;
	while(T--){
		read(n),read(m),read(mod);
		go(i,1,mod){
			jc[i]=jc[i-1]*i%mod;
			inv[i]=qpow(jc[i],mod-2);
		}
		cout<<lucas(n+m,m)<<endl;
	}
	return 0;
}
posted @ 2019-09-02 11:22  White_star  阅读(147)  评论(0编辑  收藏  举报
}