0 pts求助!
查看原帖
0 pts求助!
1120828
linjinkun楼主2024/5/27 13:06
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
#define int long long 
int jie[N];
int fa[N];
int p;
int fast_pow(int a,int b)
{
	int ans = 1;
	while(b)
	{
		if(b&1)
		{
			ans = ans*a%p;
		}
		a = a*a%p;
		b>>=1;
	}
	return ans%p;
}
int C(int n,int m)
{
	if(n<m||n<0||m<0)
	{
		return 0;
	}
	return jie[n]*fa[m]%p*fa[n-m]%p;
}
int lucas(int n,int m)
{ 
	if(!m)
	{
		return 1;
	}
	return C(n%p,m%p)*lucas(n/p,m/p)%p;
}
signed main()
{
	int t;
	scanf("%lld",&t);
	while(t--)
	{
		int n,m;
		scanf("%lld %lld %lld",&n,&m,&p);
		memset(fa,0,sizeof(fa));
		memset(jie,0,sizeof(jie));
		jie[0] = 1;
		for(int i = 1;i<=n+m;i++)
		{
			jie[i] = jie[i-1]*i%p;
		}
		fa[n+m] = fast_pow(jie[n+m],p-2);
		for(int i = n+m-1;i>=0;i--)
		{
			fa[i] = fa[i+1]*(i+1)%p;
		}
		printf("%lld\n",lucas(n+m,n));
	}
	return 0;
}

前天刚学了卢卡斯定理,结果连交好几次都是 00 分。有哪位大佬帮忙调一下?

2024/5/27 13:06
加载中...