首页 > 其他分享 >Lucas 定理学习笔记

Lucas 定理学习笔记

时间:2023-05-10 13:33:09浏览次数:36  
标签:Lucas limits pmod 定理 笔记 times ll equiv

一、定理

给定 \(n,m,p\),\(p\) 是质数,求 \(C_{m+n}^n\bmod p\),\(n,m\le 10^{18},p\le 10^6\)。
这题可以用 Lucas 定理求解。
Lucas 定理:
当 \(p\) 是个质数时,\(\forall m,n\in N,C_n^m\equiv C_{\lfloor\frac{n}{p}\rfloor}^{\lfloor\frac{m}{p}\rfloor}\times C_{n\bmod p}^{m\bmod p}\pmod{p}\)。

要证明这个结论,要先证明一个引理:
当 \(p\) 是个质数时,\((1+x)^p\equiv 1^p+x^p\pmod{p}\)。
为什么?我们知道,\(\forall n\in [0,p],C_p^n=\frac{p!}{n!\times(p-n)!}\)。由于 \(p\) 是个质数,所以分子的质因数中有且仅有 1 个 \(p\)。

  1. \(n=0\) 或 \(n=p\) 此时分母也有 1 个 \(p\),并且 \(C_p^n=1\)。
  2. \(0<n<p\),此时分母没有质因数 \(p\),所以此时 \(C_p^n\equiv 0\pmod p\)。

然后我们用二项式定理拆开:
\((1+x)^p\equiv\sum\limits_{i=0}\limits^{p}C_p^i\times 1^{p-i}\times x^i\)
\(\equiv\sum\limits_{i=0}\limits^{p}C_p^i\times x^i\)
\(\equiv C_p^0\times x^0+C_p^p\times x^p\)
\(\equiv 1+x^p\pmod{p}\)
这样,引理就证完了。

然后就是 Lucas 定理了。

我们知道,\(C_n^m\) 可以代表 \((1+x)^n\) 的 \(m\) 次项的系数。
假设 \(n=a\times p+b,m=c\times p+d,b,d\in [0,p-1]\),
那么 \((1+x)^n\equiv (1+x)^{a\times p}\times (1+x)^b\)
\(\equiv ((1+x)^p)^a\times (1+x)^b\)
\(\equiv (1+x^p)^a\times (1+x)^b\)

然后考虑 \(m\) 次项的系数,
\(C_n^m x^m\equiv C_a^c x^{p\times c}\times C_b^d x^d\pmod p\)。
所以就知道 \(C_n^m\equiv C_a^c\times C_b^d\pmod p\),
也就是 \(C_n^m\equiv C_{\lfloor\frac{n}{p}\rfloor}^{\lfloor\frac{m}{p}\rfloor}\times C_{n\bmod p}^{m\bmod p}\pmod p\)。□

时间复杂度:预处理 \(O(p)\),单次计算 \(O(\log p)\)。

二、代码

inline void exgcd(ll &x,ll &y,ll a,ll b){
	if(!b){x=1;y=0;return;}
	exgcd(y,x,b,a%b);y-=a/b*x;
}
inline ll lucas(ll x,ll y){
	if(x<y)return 0;
	if(x<p)return a[x]*b[y]*b[x-y]%p;
	return lucas(x/p,y/p)*lucas(x%p,y%p)%p;
}
int main(){
	cin>>t;a[0]=b[0]=a[1]=b[1]=1;
	while(t--){
		cin>>n>>m>>p;
		for(ll i=2;i<p;i++)a[i]=a[i-1]*i%p;
		for(ll i=2;i<p;i++)b[i]=(p-p/i)*b[p%i]%p;
		for(ll i=2;i<p;i++)b[i]=b[i-1]*b[i]%p;
		cout<<lucas(n+m,n)<<'\n'; 
	}
	return 0;
}

三、推论

\(C_n^m\) 是质数 \(p\) 的倍数当且仅当 \(n\) 在 \(p\) 进制下有一位小于 \(m\)。

证明:假设 \((n)_p=\overline{a_0a_1…a_b},(m)_p=\overline{c_0c_1…c_d}\)。
那么反复使用 Lucas 定理,知 \(C_n^m \equiv\prod\limits_{i=0}\limits^{\max\{b,d\}} C_{a_i}^{c_i}\),多余位补 \(0\)。

然后如果存在 \(c_k>a_k\),则 \(C_{a_k}^{c_k}\equiv 0\pmod p\),所以 \(C_n^m \equiv\prod\limits_{i=0}\limits^{\max\{b,d\}} C_{a_i}^{c_i}\equiv 0\pmod p\)。

如果 \(\forall i\in [0,max\{b,d\}]\),都有 \(a_i\ge c_i\),那么由于 \(c_i\le a_i<p\),所以 \(\gcd(C_{a_i}^{c_i},p)=1\),所以 \(C_n^m\not\equiv 0\pmod p\)。□

标签:Lucas,limits,pmod,定理,笔记,times,ll,equiv
From: https://www.cnblogs.com/qwq-qaq-tat/p/17387054.html

相关文章

  • sql必知必会笔记
    sql关键字作为保留字使用,不能用于表或者列的名称sql语句不区分大小写sql语句中空格会被忽略select列名之间用逗号分隔少用*号检索,会降低性能distinct关键字作用于所有的列限制结果语法top5关键字sqlserver和access中使用fetchfirst5rowsonlyDB2......
  • Effective Modern C++ 学习笔记
    前言记录下阅读此书的感想与总结,一方面能巩固复习,另一方面也能更好地浓缩本书的精华,方便日后的回看。第五章右值引用、移动语义和完美转发它们带来的好处移动语义使得编译器能使用效率更高的移动操作来替换昂贵的复制操作移动语义使得创建只移对象成为可能,如:std::unique_ptr,t......
  • Django笔记二十三之case、when操作条件表达式搜索、更新等操作
    本文首发于公众号:Hunter后端原文链接:Django笔记二十三之条件表达式搜索、更新等操作这一篇笔记将介绍条件表达式,就是如何在model的使用中根据不同的条件筛选数据返回。这个操作类似于数据库中ifelifelse的逻辑。以下是本篇笔记的目录:model和数据准备When和Case......
  • 五月第一篇阅读笔记
    人月神话读后感书名《人月神话》中的人指的是人力,月指的是工作时间,主要的意思是人月作为一种衡量软件开发工作量的单位有其误导性,举例来说,1个人可以在10周之内做完的项目,10个人不一定可以在1周之内完成。其实在书中作者更进一步地指出,单纯地增加开发人力,不仅不能对应地减少项目......
  • React笔记-组件(一)
    React学习笔记-组件(一未完成)特点声明式组件化跨平台React脚手架a.全局安装react脚手架create-react-appnpminstallcreate-react-app-g&npxcreate-react-appmy-appb.使用create-react-app创建react应用,如果直接使用npx则无需执行这一步,直接执行第3步c......
  • React笔记-事件(三)
    React学习笔记-事件(三)定义事件React元素的事件处理和DOM元素的很相似但是有一点语法上的不同React事件的命名采用小驼峰式(camelCase)而不是纯小写如点击事件onClickimportReactfrom'react'exportdefaultclasslearnEventextendsReact.Component{///......
  • React笔记-样式(二)
    React学习笔记-样式(二)内联样式importReactfrom"react";exportdefaultclassLearnStyleextendsReact.Component{render(){return(<div>{/*以下两种方法都可以一种不用引号将css以小驼峰方式写另一种加上引号写......
  • React笔记-渲染列表Key(五)
    React学习笔记-渲染列表Key(五)渲染列表需要添加key属性importReactfrom"react"exportdefaultclassLearnKeyextendsReact.Component{state={infos:[{name:'Bob',age:18},{name:'kitty',age:20},{name:......
  • React笔记-state(四)
    React学习笔记-state(四)概念state的主要作用是用于组件保存控制以及修改自己的状态它算是组件的私有属性不可通过外部访问和修改只能通过组件内部的this.setState来修改修改state属性会导致组件的重新渲染注意:如果直接通过this.state.xxx的方式修改,组件不会重新渲染,但......
  • 中国剩余定理学习笔记
    给定\(n\)组非负整数\(a_i,b_i\),其中\(b_i\)两两互质,求解关于\(x\)的方程组的最小非负整数解。\(\begin{cases}x\equivb_1\({\rmmod}\a_1)\\x\equivb_2\({\rmmod}\a_2)\\...\\x\equivb_n\({\rmmod}\a_n)\end{cases}\)这样的题怎么做呢?首先给出中......