题目题意很简单
给你三个数 n m p
求C n m %p
由于p是不固定的,所以不能运用阶乘来打表
这里运用到了Lucas定理
定理的介绍:
http://blog.youkuaiyun.com/ACdreamers/article/details/8037918
对于 n m 较大的时候 Lucas定理就起到了作用
AC代码:
#include<iostream>
using namespace std;
typedef long long ll;
ll quickmod(ll a,ll b,ll m){ll ans=1;while(b)
{if(b&1)ans=(ans*a)%m;b>>=1;a=a*a%m;}return ans;}
ll inv(ll a,ll p){return quickmod(a, p-2, p);}
ll C(ll n,ll m,ll p){
if(m>n)
return 0;
ll ans=1;
for(int i=1;i<=m;++i){
ll a=(n-m+i)%p;
ll b=i%p;
ans=ans*a%p*inv(b,p)%p;
}
return ans;
}
ll Lucas(ll n,ll m,ll p){
if(m==0)
return 1;
return Lucas(n/p,m/p,p)*C(n%p,m%p,p)%p;
}
int main(){
int T;
ll n,m,p;
cin>>T;
while(T--){
cin>>n>>m>>p;
cout<<Lucas(n,m,p)<<endl;
}
}