lucas定理板子

luogu P3807 【模板】卢卡斯定理

题目背景

这是一道模板题。

题目描述

给定n,m,p(1≤ n,m,p≤ 10)

求 C(n+m,m​) mod p

保证P为prime

C表示组合数。

一个测试点内包含多组数据。

输入输出格式

输入格式:

 

第一行一个整数T(T10),表示数据组数

第二行开始共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;
} 

  

 
posted @ 2017-10-23 11:20  Stump  阅读(289)  评论(0编辑  收藏  举报