【题目】
https://www.luogu.org/problemnew/show/P3807
【输入格式】
第一行一个整数T(T\le 10T≤10),表示数据组数
第二行开始共T行,每行三个数n m p,意义如上
【输出格式】
共T行,每行一个整数表示答案。
【输入样例】
2
1 2 5
2 1 5
【输出样例】
3
3
#include<bits/stdc++.h> #define ll long long #define L I64d #define maxn 100005 using namespace std; ll fac[2*maxn]; int p,T; void init(int n,int m)//预处理阶乘 { fac[0]=1; for(int i=1;i<=n+m;i++) fac[i]=fac[i-1]*i%p; } ll quickpow(ll x,ll y) { ll ans=1; while(y) { if(y&1) ans=ans*x%p; x=x*x%p; y=y>>1; } return ans%p; } ll C(ll m,ll n) { if(m>n) return 0; return fac[n]*quickpow(fac[m],p-2)%p*quickpow(fac[n-m],p-2);//费马小定理求逆元 } ll lucas(ll m,ll n) { if(!m) return 1; return lucas(m/p,n/p)*C(m%p,n%p)%p; } int main() { scanf("%d",&T); while(T--) { int n,m; scanf("%d%d%d",&n,&m,&p); init(); printf("%Ld\n",lucas(m,n+m)); } return 0; } /* 2 1 2 5 2 1 5 */
原文:https://www.cnblogs.com/psyyyyyy/p/10498516.html