hdu3037Saving Beans——卢卡斯定理

题目:http://acm.hdu.edu.cn/showproblem.php?pid=3037

卢卡斯定理模板——大组合数的取模

代码如下:

#include<iostream>
#include<cstdio>
using namespace std;
long long t,n,m,p,a[100005];
long long qpow(long long x,long long y)
{
	if(y==0)return 1;
	long long ans=1;
	while(y>0)
	{
		if(y%2)ans=ans*x%p;//不能是ans*=x%p; 
		y/=2;
		x=x*x%p;
	}
	return ans;
}
long long getc(long long n,long long m)
{
	if(n<m)return 0;
	if(m>n-m)m=n-m;
	long long s1=1,s2=1;
	for(int i=1;i<=m;i++)
	{
		s2=s2*i%p;
		s1=s1*(n-i+1)%p;
	}
	return s1*qpow(s2,p-2)%p;
//	return (a[n]*qpow(a[m],p-2))%p*qpow(a[n-m],p-2)%p;
}
long long lucas(long long n,long long m)
{
	if(m==0)return 1;
	return getc(n%p,m%p)*lucas(n/p,m/p)%p;
}
int main()
{
	scanf("%lld",&t);
	while(t--)
	{
		scanf("%lld%lld%lld",&n,&m,&p);
//		a[0]=1;
//		for(int i=1;i<=p;i++)
//			a[i]=a[i-1]*i%p;
		printf("%lld
",lucas(n+m,n)%p);
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/Zinn/p/8276653.html