码迷,mamicode.com
首页 > 其他好文 > 详细

Lucas定理

时间:2018-02-25 20:45:38      阅读:241      评论:0      收藏:0      [点我收藏+]

标签:while   cstring   cst   amp   turn   can   print   span   存在   

模板

公式:Lucas(n,m)=C(n%p,m%p)*Lucas(n/p,m/p)

Lucas定理保证了求C时逆元存在

注意逆元存在条件

不会证明

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long Lint;
const int maxn=200009;

int T;
 
int n,m,mm;
Lint f[maxn];
Lint Ksm(Lint a,int p){
	Lint ret=1;
	for(;p;p>>=1,a=a*a%mm){
		if(p&1)ret=ret*a%mm;
	}
	return ret;
}
Lint Inv(Lint x){
	return Ksm(x,mm-2);
}

Lint C(int n,int m){
	if(m>n)return 0;
	return f[n]*Inv(f[m])*Inv(f[n-m])%mm;
}
Lint Lucas(int n,int m){
	if(m==0)return 1;
	return C(n%mm,m%mm)*Lucas(n/mm,m/mm)%mm;
}

int main(){
	scanf("%d",&T);
	while(T--){
		scanf("%d%d%d",&n,&m,&mm);
		n=n+m;
		f[0]=1;
		for(int i=1;i<=n;++i)f[i]=f[i-1]*i%mm;
		printf("%lld\n",Lucas(n,m));
	}
	return 0;
}

  

Lucas定理

标签:while   cstring   cst   amp   turn   can   print   span   存在   

原文地址:https://www.cnblogs.com/zzyer/p/8470366.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!