好奇怪地爆0了
查看原帖
好奇怪地爆0了
536773
BSHank楼主2022/8/6 14:20

用lucas定理配合快速幂做,代码:

#include<iostream>
using namespace std;
#define ll long long
ll mod,t,m,n,i;
ll mod_pow(ll x,ll n,ll mod){ //快速幂 
	ll res=1;
	while(n){
		if(n&1)res=res*x%mod;
		x=x*x%mod;
		n>>=1;
	}
	return res;
}
ll C(ll n,ll m){ //这个函数应该不会有问题
	ll ans=1,x=1,i; //阶乘初始化
	for(i=2;i<=n;i++)
		ans=ans*i%mod;
	for(i=2;i<=m;i++)
		x=x*i%mod;
	ans=ans*mod_pow(x,mod-2,mod)%mod; //x^p-2求逆元 
	m=n-m;x=1;
	for(i=2;i<=m;i++)
		x=x*i%mod;
	ans=ans*mod_pow(x,mod-2,mod)%mod;
	return ans;
}
ll Lucas(ll a,ll b){
	if(a<mod && b<mod)return C(a,b);
	else return C(a%mod,b%mod)*Lucas(a/mod,b/mod);
} 
int main(){
	cin>>t;
	while(t--){
		cin>>n>>m>>mod;
		cout<<Lucas(n+m,n)<<endl;
	}
	return 0;
}

但是这样子如果

n=18716,n=18716, m=19718,m=19718, p=5393p=5393, 答案是 00 但我输出 981981

想了半天没想明白,求助大佬

2022/8/6 14:20
加载中...