首页 > 其他 > 详细

卢卡斯定理

时间:2019-07-23 21:06:59      阅读:103      评论:0      收藏:0      [点我收藏+]

思路:

板子,不会证,直接用结论。

用于求大组合数

c(n,m)%mod=C(n%mod,m%mod)*C(n/mod,m/mod)%mod

 

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int T;
ll n,m,p;
ll a[100005];
inline ll read()
{
	bool f=0;ll x=0;char c=getchar();
	while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=1;c=getchar();}
	while(c>=‘0‘&&c<=‘9‘){x=(x<<3)+(x<<1)+c-‘0‘;c=getchar();}
	return f?-x:x;
}
ll ks(ll x,ll k)
{
	ll num=1;
	while(k)
	{
		if(k&1)
			num=num*x%p;
		x=x*x%p;
		k>>=1;
	}
	return num;
}
ll c(ll n,ll m)
{
    if(m>n)return 0;
    return ((a[n]*ks(a[m],p-2))%p*ks(a[n-m],p-2)%p);//直接求出小范围数的组合数
}
ll lucas(ll n,ll m)
{
	if(!m)return 1;
	return c(n%p,m%p)*lucas(n/p,m/p)%p;//递归缩小范围
}
int main()
{
	T=read();
	while(T--)
	{
		n=read();m=read();p=read();
		a[0]=1;
        for(int i=1;i<=p;i++)a[i]=(a[i-1]*i)%p;
        cout<<lucas(n+m,n)<<endl;
	}
	return 0;
}

  

卢卡斯定理

原文:https://www.cnblogs.com/oierjzy/p/11234415.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!