Lucas定理求调
查看原帖
Lucas定理求调
959582
dongrunxuan楼主2024/7/16 19:49

rt,WA+RE

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
#define int long long
int t,n,m,p;
int f[maxn],g[maxn];
int qpow(int base,int q)
{
	int res=1;
	while(q)
	{
		if(q&1)
		{
			res=base*res%p;
		}
		q/=2;
		base=base*base%p;
	}
	return res;
}
void init()
{
	f[0]=g[0]=1;
	for(int i=1;i<=p;i++)
	{
		f[i]=f[i-1]*i%p;
		g[i]=g[i-1]*qpow(i,p-2)%p;
	}
	return;
}
int getC(int n,int m)
{
	return f[n]*g[m]*g[n-m]%p;
}
int lucas(int x,int y)
{
    if(y==0)
    {
		return 1;
	}
    return lucas(x/p,y/p)*getC(x%p,y%p)%p;
}
signed main()
{
    cin>>t;
    while(t--)
    {
    	init();
        cin>>n>>m>>p;
        cout<<lucas(n+m,n)<<endl;
    }
    return 0;
}
2024/7/16 19:49
加载中...