首页 > 其他分享 >Lucas定理入门

Lucas定理入门

时间:2024-09-02 19:02:58浏览次数:4  
标签:lfloor frac Lucas int bmod 入门 rfloor 定理 equiv

前置结论

如果 \(p\) 为素数,有以下结论:

  1. \(a^p \equiv a \pmod p\)
    即费马小定理

  2. \[C_{p}^i \equiv \begin{cases} 1 & i=0 或者 i=p \\ 0 & 其他情况 \end{cases} \pmod p \]

证明可以展开

  1. \((a+b)^p \equiv a^p + b^p \pmod p\)
    证明1:用结论1

    \[\begin{aligned} (a+b)^p &\equiv a+b \\ &\equiv a^p + b^p \pmod p \end{aligned} \]

    证明2:用结论2 和 二项式定理

    \[\begin{aligned} (a+b)^p &\equiv \sum_{i=0}^{p} C_{p}^{i} \times a^i \times b^{p-i} \\ &\equiv a^p + b^p \pmod p \end{aligned} \]


Lucas定理

内容

$ C_{n}^{m} \equiv C_{\lfloor \frac{n}{p} \rfloor} ^{\lfloor \frac{m}{p} \rfloor} \cdot C_{n \bmod p}^{m \bmod p} \pmod p \text{ p 是 质数}$

用途

当质数 \(p\) 较小时,求解组合数在模意义下的值


证明

二项式定理得:\(C_n^m\) 等于 \((x+1)^n\) 展开后 \(x^m\) 的系数

\[\begin{aligned} (x+1)^n &\equiv (x+1)^{\lfloor \frac{n}{p} \rfloor \times p + n \bmod p} \\&\equiv (x+1)^{\lfloor \frac{n}{p} \rfloor \times p} \cdot (x+1)^{n \bmod p} \\&\equiv (x^p + 1)^{\lfloor \frac{n}{p} \rfloor} \cdot (x+1)^{n \bmod p} \end{aligned} \]

所以 \((x+1)^n\) 展开后 \(x^m\) 的系数 = \(\sum (x^p + 1)^{\lfloor \frac{n}{p} \rfloor}\)展开后\(x^{m-r}\)的系数 \(\times (x+1)^{n \bmod p}\)展开后 \(x^r\) 的系数

容易得到 \(r \le n\bmod p < p\) 并且 \(p \mid (m-r)\) , 也就是说 \(m\) 可以写成 \(m=k \times p + r , r<p\) 的形式,根据带余除法可知这种表示是唯一的,即只有一个唯一的 \(r\) 和 \(k\) ,其中 $r = m \bmod p,k = \lfloor \frac{m}{p} \rfloor $

所以$ C_{n}^{m} \equiv C_{\lfloor \frac{n}{p} \rfloor} ^{\lfloor \frac{m}{p} \rfloor} \cdot C_{n \bmod p}^{m \bmod p} \pmod p$


代码实现

【模板】卢卡斯定理/Lucas 定理

#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int N=2e5+5;
inline int read(){
    int w = 1, s = 0;
    char c = getchar();
    for (; c < '0' || c > '9'; w *= (c == '-') ? -1 : 1, c = getchar());
    for (; c >= '0' && c <= '9'; s = 10 * s + (c - '0'), c = getchar());
    return s * w;
}
int T,n,m,p;
int fac[N],inv[N],q[N];
int C(int n,int m){
	if(m>n) return 0;
	return fac[n]*q[m]%p*q[n-m]%p;
}
int Lucas(int n,int m){
	if(!m) return 1;
	return C(n%p,m%p)*Lucas(n/p,m/p)%p;
}
signed main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	T=read();
	while(T--){
		n=read(),m=read(),p=read();
		fac[0]=1;
		for(int i=1;i<p;i++) fac[i]=fac[i-1]*i%p;
		inv[1]=1;
		for(int i=2;i<p;i++) inv[i]=inv[p%i]*(p-p/i)%p;
		q[0]=1;
		for(int i=1;i<p;i++) q[i]=q[i-1]*inv[i]%p;
		n=n+m;
		printf("%lld\n",Lucas(n,m));
	}
	return 0;
}


拓展

考虑 \(m,n\) 在 \(p\) 进制下的表示,就会发现 \(C^m_n\) 就等于 \(m,n\) 在 \(p\) 进制下每一位对应的组合数的乘积( \(\bmod\)操作就是取最后一位,\(\lfloor \rfloor\)就是左移一位 ) 。

特殊的,当 \(p=2\) 时,组合数有值当且仅当 \(m\) 是 \(n\) 的子集
此时就很高位前缀和 (关于高位前缀和的知识看这)

标签:lfloor,frac,Lucas,int,bmod,入门,rfloor,定理,equiv
From: https://www.cnblogs.com/FloatingLife/p/18393315

相关文章

  • Transformer模型入门:简单而直观的解释
    Transformer模型入门:简单而直观的解释引言你是否曾经对现代人工智能如何理解和生成人类语言感到好奇?今天,我们将以一种前所未有的简单方式来解释Transformer模型-这个革命性的AI架构。Transformer的核心:问答结构想象一下,如果我们可以将所有的问题都简化为"问题-答......
  • 【OpenCV】快速入门(二)--视频处理(1)
    OpenCV–视频处理先看代码#include<iostream>#include"opencv2/highgui/highgui.hpp"#include"opencv2/imgproc/imgproc.hpp"intmain(intargc,char**argv){cv::namedWindow("Example3",cv::WINDOW_AUTOSIZE);cv::VideoCaptu......
  • 学习Python多久才能入门?
    转行学习编程,Python语言是大多数人的首要选择。因为它不仅在web开发、游戏开发、数据分析、网络爬虫等领域有着优异的表现,更是人工智能和机器学习的首选语言,那么学会Python大概需要多久?我们一起来看看吧。学习Python所需的时间取决个人的学习速度、学习目标和学习方式。......
  • Arduino基础入门学习——使用DHT11温湿度传感器获取温湿度
    使用DHT11温湿度传感器获取温湿度一、前言二、DHT11介绍三、准备工作四、程序代码五、运行结果六、结束语一、前言老规矩,再来一句名言激励激励大家,当然,也激励自己(狗头):             读书百遍,其义自见。——晋·陈寿二、DHT11介绍DHT11采用单总线......
  • python入门每日一练2023/2/10
    python入门每日一练,可以提高您的python水平,今天是2月10日,上一课的答案是foriinrange(8):print(i)qq="xxxxxxxxx"email="@qq.com"如何将上面的字符串组成一段邮箱地址?......
  • python入门每日一练2023/2/13
    python入门每日一练,可以提高您的python水平,今天是2月13日,上一课的答案是foriinrange(1,len(strb)+1):ifstrb[i]==p:print(i)qq="qq"www="www"com=".com"如何组成www.qq.com网址?(难度★☆☆☆☆)......
  • python入门每日一练2023/2/14
    python入门每日一练,可以提高您的python水平,今天是2月14日,上一课的答案是url=www+qq+coma=3.1415926b=3.1415926c=a+bc等于几?(难度★☆☆☆☆)......
  • python入门每日一练2023/2/12
    python入门每日一练,可以提高您的python水平,今天是2月12日,上一课的答案是importrepat="python"a=re.findwall(pat,stra)print(a[0])strb="asdfghjklqwertyuiopzxcdweftgh"如何在上面的字符串中找到p在第几个?(难度★★☆☆☆)......
  • python入门每日一练2023/2/16
    python入门每日一练,可以提高您的python水平,今天是2月16日,上一课的答案是print(1)print("执行结束")while1==1:print(1)if5==1:breakprint("执行结束")如何简化这个代码?(难度★☆☆☆☆)......
  • python入门每日一练2023/2/21
    python入门每日一练,可以提高您的python水平,今天是2月21日,由于博主前段时间比较繁忙,最近都没有发,请谅解!上一课的答案是print("--------欢迎光临----------")print('初始化完成')defsayhello():print("hello")foriinrange(1,10)if1==1:print(i......