lucas定理板子
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; }