luogu P3807 【模板】卢卡斯定理
题目背景
这是一道模板题。
题目描述
给定n,m,p(1≤ n,m,p≤ 105 )
求 C(n+m,m) mod p
保证P为prime
C表示组合数。
一个测试点内包含多组数据。
输入输出格式
输入格式:
第一行一个整数T(T≤10),表示数据组数
第二行开始共T行,每行三个数n m p,意义如上
输出格式:
共T行,每行一个整数表示答案。
输入输出样例
输入样例#1: 复制
2
1 2 5
2 1 5
输出样例#1: 复制
3 3
AC代码
#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
#define BIG 100011
#define ll long long
#define FOR(i,s,t) for(register int i=s;i<=t;++i)
using namespace std;
ll fac[BIG];
int n,m,p;
inline ll fp(int a,int b){
if(b==1)
return a;
if(b==0)
return 1;
ll ans=fp(a,b>>1);
ans=ans*ans%p;
return b&1?ans*a%p:ans;
}
inline ll getc(int n,int m){
return m<n?0:fac[m]*fp(fac[n],p-2)%p*fp(fac[m-n],p-2)%p;
}
inline ll lucas(int n,int m,int p){
return m?getc(n%p,m%p)*lucas(n/p,m/p,p)%p:1;
}
int T;
int main(){
fac[0]=1ll;
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&n,&m,&p);
FOR(i,1,p-1)
fac[i]=fac[i-1]*i%p;
printf("%lld\n",lucas(m,n+m,p));
}
return 0;
}