求助Lucas定理
查看原帖
求助Lucas定理
565945
Azure__楼主2022/6/21 19:56

20pts,应该不是逆元出错,用了递推和费马小定理算逆元,结果都是一样。

已知一错误数据:输入:30325 1620 9973

答案:9893 我的答案:0

谢谢大佬

#include<bits/stdc++.h>
#define int long long
using namespace std;
int d[100001];
inline int read(){
	char c; int x=0,f=1; c=getchar();
	while(c<'0'||c>'9'){ if(c=='-') f=-1; c=getchar(); }
	while(c>='0'&&c<='9'){ x=(x<<3)+(x<<1)+(c^48); c=getchar(); }
	return x*f;
}
inline int work(int a,int b,int p){
	int ans=1;
	while(b){
		if(b%2==1){ ans=ans*a%p; b--; }
		if(b%2==0){ b/=2; a=a*a%p; }
	}
	return ans;
}
inline int inv(int a,int b,int p){
	return (a%p*work(b,p-2,p)%p)%p;
}
inline int C(int n,int m,int p){
	if(m>n) return 0;
	int result1=inv(d[n],d[m],p)%p;
	int result2=inv(result1,d[n-m],p)%p;
	return result2;
}
inline int Lucas(int n,int m,int p){
	if(m==0) return 1;
	if(m==1) return n;
	return (Lucas(n/p,m/p,p))%p*(C(n%p,m%p,p))%p; 
}
signed main()
{
	int t=read();
	while(t--){
		int n=read(),m=read(),p=read();		
		d[1]=1;
    	for(int i=2;i<=p;i++){
	    	d[i]=d[i-1]*i%p;
    	}
		cout<<Lucas(n+m,n,p)<<"\n";
	}
	return 0;
}
```
2022/6/21 19:56
加载中...