ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

卢卡斯定理

2022-05-27 16:01:34  阅读:149  来源: 互联网

标签:lfloor right 定理 rfloor ans 卢卡斯 left mod


卢卡斯定理就是解决组合数模p的问题的:

\[C_{n}^{m}\mod p \]

那么卢卡斯定理究竟是如何解决的呢?
首先,将\(n\),\(m\)写成\(k\)进制数

\[n= \left (a_{k}a_{k-1}……a_{1} \right )_{p} \]

\[m= \left (b_{k}b_{k-1}……b_{1} \right )_{p} \]

卢卡斯定理:

\[C_{n}^{m}\mod p=\prod_{i=1}^{k} C_{a_{i}}^{b_{i}}\mod p \]

证明:
只要证明\(C_{n}^{m}\mod p=C_{\left \lfloor {n\div p} \right \rfloor}^{\left \lfloor {m\div p} \right \rfloor}\times C_{n \mod p}^{m \mod p}\mod p\),然后递推就可以推得卢卡斯定理了。
首先,需要一个二项式\(\left (1+x \right )^{n}\)

\[\left (1+x \right )^{n}=\left (1+x \right )^{\left \lfloor {n\div p} \right \rfloor \times p}\times \left ( 1+x \right )^{n \mod p} \]

接着,需要用到费马小定理

\[\left ( 1+x \right )^{p}\equiv \left (1+x \right )\equiv \left (1+x^{p} \right ) \left ( \mod p \right ) \]

然后,在模p操作下

\[\left (1+x \right )^{n}\equiv \left (1+x^{p} \right )^{\left \lfloor {n\div p} \right \rfloor}\times \left (1+x \right )^{n \mod p}\equiv \sum_{i=0}^{\left \lfloor {n\div p} \right \rfloor}C_{\left \lfloor {n\div p} \right \rfloor}^{i}x^{p\times i}\times \sum_{j=0}^{n\mod p}C_{n\mod p}^{j}x^{j} \left ( \mod p \right ) \]

最后,看\(x^{m}\)这一项的系数,此时\(p\times i+j=m\)。

\[C_{n}^{m}\equiv C_{\left \lfloor {n\div p} \right \rfloor}^{i}\times C_{n\mod p}^{j}\equiv C_{\left \lfloor {n\div p} \right \rfloor}^{\left \lfloor {m\div p} \right \rfloor}\times C_{n\mod p}^{m\mod p}(\mod p) \]

代码:

#include<iostream>
#define int long long
using namespace std;
int t;
int n,m,p;
int f[200010];
int ksm(int x,int y){
	if(y==0){
		return 1;
	}
	int ans=ksm(x,y/2);
	ans=ans*ans%p;
	if(y%2==1){
		ans=ans*x%p;
	}
	return ans;
}
signed main(){
	cin>>t;
	while(t--){
		cin>>n>>m>>p;
		f[0]=1;
		for(int i=1;i<=p-1;i++){
			f[i]=f[i-1]*i%p;
		}
		int a=n;
		int b=n+m;
		int ans=1;
		while(b!=0){
			if(a%p>b%p){
				ans=0;
				break;
			}
			else{
				ans=ans*f[b%p]%p*ksm(f[a%p],p-2)%p*ksm(f[b%p-a%p],p-2)%p;
			}
			a/=p;
			b/=p;
		}
		cout<<ans<<endl;
	}
	return 0;
}

标签:lfloor,right,定理,rfloor,ans,卢卡斯,left,mod
来源: https://www.cnblogs.com/z-2-we/p/16317952.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有