萌 新求 助 ( 会 关 注 的 )
查看原帖
萌 新求 助 ( 会 关 注 的 )
91956
Dreamweaver楼主2021/5/9 20:09

0pts

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f
#define re register
#define maxn 100000
#define int long long
int fac[100011],inv[100010];
int mod=0;
inline int read(){
    int x=0,f=1;char ch=getchar();
    while (ch<'0'||ch>'9') {if(ch=='-')f=-1; ch=getchar();}
    while (ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0'; ch=getchar();}
    return x*f;
}
void exgcd(int a,int b,int&g,int&x,int&y)
{
	if(b==0)	
	{
		g=a,x=1,y=0;
		return ;
	}
	exgcd(b,a%b,g,x,y);
	int t=x;
	x=y;
	y=t-(a/b)*x;
}
int inverse(int a,int p)
{
	int x,g,y;
	exgcd(a,p,g,x,y);
	x/=g;
	p/=g;
	return (x%p+p)%p;
}
void pre(int o)
{
	fac[0]=1;
	for(re int i=1;i<=o;i++)
		fac[i]=1ll*fac[i-1]*i%mod;
	inv[o]=inverse(fac[o],mod);
	for(re int i=o-1;i>=0;i--)
		inv[i]=inv[i+1]*(i+1)%mod;
}
int C(int m,int n)
{
	return fac[m]*inv[n]%mod*inv[m-n]%mod;
}
inline int Lucas(int m,int n)
{
	if(m<n)	return 0;
	if(m<mod)	return fac[m]*inv[n]*inv[m-n]%mod;
	return Lucas(m/mod,n/mod)*Lucas(m%mod,n%mod)%mod;
 } 
int n,m;
signed main()
{
//	freopen("a.in","r",stdin);
//	freopen("a.out","w",stdout);
//	printf("%dM\n",(sizeof(dp) >> 20));
	int t=read();
	while(t--)
	{
		memset(fac,0,sizeof fac);
		memset(inv,0,sizeof inv);
		n=read(),m=read(),mod=read();
		pre(n+m);
		cout<<Lucas(n+m,n)<<'\n';
	}
	return 0;
}


2021/5/9 20:09
加载中...