什么是Lucas定理

这是一个有助于分解组合数来求解的定理,适合模数小,数字大的问题。

有质数 \(p\),对于\(n,m\),如果\(n=k_1p+b_1,m=k_2p+b_2\),有

\[C_n^m\equiv C_{k_1}^{k_2}C_{b_1}^{b_2} \pmod p
\]

由此可以分解成较小的问题求解。

证明Lucas定理

这个证明利用了二项式定理的思路,前所未闻,真的很有趣。

根据二项式定理可以得到 \((1+x)^n\)中\(x^m\)的系数为\(C_n^m\)。

我们用这一点作为突破口,对于\((1+x)^n\),我们有

\[(1+x)^n\equiv (1+x)^{k_1p+b_1}\equiv (1+x)^{k_1p}(1+x)^{b_1}\equiv ((1+x)^p)^{k_1}(1+x)^{b_1}\pmod p
\]

然后有一个很有意思的东西

\[(1+x)^p\equiv 1+x^p \pmod p
\]

为什么呢?将式子拆开后,显然除了第一项与最后一项,其他项是\(p\)的倍数,自然就会抹掉了。

继续进行推导,我们有

\[(1+x)^n\equiv(1+x^p)^{k_1}(1+x)^{b_1}\pmod p
\]

于是右边的式子拆开可以得到

\[(\sum_{i=0}^{k_1} C_{k_1}^i x^{pi})(\sum_{j=0}^{b_1} C_{b_1}^j x^{j})\pmod p
\]

我们要求\(x^m\)的系数,也就是\(x^{k_2p+b_2}\)的系数。

由于\(b_1<p\),所以\(k_2p\)只能让\(\sum_{i=0}^{k_1} C_{k_1}^i x^{pi}\)负责了,当\(i=k_2\)时符合条件,此时系数为\(C_{k_1}^{k_2}\)。

剩下部分由\(\sum_{j=0}^{b_1} C_{b_1}^j x^{j}\)负责,当\(j=b_2\)时符合条件,此时系数为\(C_{b_1}^{b_2}\)。

因此 \(x^m\)的系数为\(C_{k_1}^{k_2}C_{b_1}^{b_2}\),前文已知根据二项式定理\(x^m\)的系数为\(C_n^m\),我们得到

\[C_n^m\equiv C_{k_1}^{k_2}C_{b_1}^{b_2} \pmod p
\]

由此,完成了Lucas定理的证明。

Lucas定理求解组合数的C++实现

代码上没什么难点,首先基础的组合数求解还是要有的,也就是我们需要预处理阶乘逆元,然后使用Lucas将组合数拆开再用基础的组合数求解即可。

long long ksm(long long x,long long y)
{
long long sum=1;
while(y)
{
if(y&1)
{
sum*=x;
sum%=mod;
}
x*=x;
x%=mod;
y>>=1;
}
return sum;
}
long long C(long long n,long long m)
{
if(m>n)return 0;
if(m==0||n==m)return 1;
return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
long long lucas(long long n,long long m)
{
if(m>n)return 0;
if(n<mod)return C(n,m);
return lucas(n/mod,m/mod)*lucas(n%mod,m%mod)%mod;
}
void init()
{
fac[0]=1;
for(int i=1;i<=mod-1;i++)
{
fac[i]=fac[i-1]*i%mod;
}
inv[mod-1]=ksm(fac[mod-1],mod-2);
for(int i=mod-2;i>=0;i--)
{
inv[i]=inv[i+1]*(i+1)%mod;
}
}

Lucas定理——定义、证明、实现、运用的更多相关文章

  1. xdoj-1057(Lucas定理的证明及其模板)

    Lucas定理的证明: 转自百度百科(感觉写的还不错) 首先你需要这个算式:    ,其中f > 0&& f < p,然后 (1 + x) nΞ(1 + x) sp+q Ξ ...

  2. lucas定理的证明

    http://baike.baidu.com/link?url=jJgkOWPSRMobN7Zk4kIrQAri8m0APxcxP9d-C6qSkIuembQekeRwUoEoBd6bwdidmoCR ...

  3. lucas定理证明

    Lucas 定理(证明) A.B是非负整数,p是质数.AB写成p进制:A=a[n]a[n-1]...a[0],B=b[n]b[n-1]...b[0]. 则组合数C(A,B)与C(a[n],b[n])* ...

  4. Lucas定理学习笔记

    从这里开始 一个有趣的问题 扩展Lucas算法 一个有趣的问题 题目大意 给定$n, m, p$,求$C_{n}^{m}$除以$p$后的余数. Subtask#1  $0\leqslant m\leq ...

  5. 『Lucas定理以及拓展Lucas』

    Lucas定理 在『组合数学基础』中,我们已经提出了\(Lucas\)定理,并给出了\(Lucas\)定理的证明,本文仅将简单回顾,并给出代码. \(Lucas\)定理:当\(p\)为质数时,\(C_ ...

  6. 初等数论及其应用——Lucas定理

    Lucas定理用于解决较大组合数的取模问题,下面的理论整理源自冯志刚的<初等数论>,其与百度百科上呈现的Lucas定理形式上不同,但是容易看到二者的转化形式. 首先我们来整理一下冯志刚的& ...

  7. lucas定理 +证明 学习笔记

    lucas定理 p为素数 \[\dbinom n m\equiv\dbinom {n\%p} {m\%p} \dbinom {n/p}{m/p}(mod p)\] 左边一项直接求,右边可递归处理,不包 ...

  8. 【luogu P3807】【模板】卢卡斯定理/Lucas 定理(含 Lucas 定理证明)

    [模板]卢卡斯定理/Lucas 定理 题目链接:luogu P3807 题目大意 求 C(n,n+m)%p 的值. p 保证是质数. 思路 Lucas 定理内容 对于非负整数 \(n\),\(m\), ...

  9. 组合数取模Lucas定理及快速幂取模

    组合数取模就是求的值,根据,和的取值范围不同,采取的方法也不一样. 下面,我们来看常见的两种取值情况(m.n在64位整数型范围内) (1)  , 此时较简单,在O(n2)可承受的情况下组合数的计算可以 ...

  10. Lucas定理及其应用

    Lucas定理这里有详细的证明. 其实就是针对n, m很大时,要求组合数C(n, m) % p, 一般来说如果p <= 10^5,那么就能很方便的将n,m转化为10^5以下这样就可以按照乘法逆元 ...

随机推荐

  1. NO_PUBKEY 76F1A20FF987672F

    在ubuntu18.04上安装win时,执行sudo add-apt-repository 'deb https://dl.winehq.org/wine-builds/ubuntu/ bionic ...

  2. h5移动端开发经验积累篇

    h5键盘控制 const el = document.documentElement || document.body const originHeight = el.clientHeight win ...

  3. Linux 复制时排除某文件/目录

    如果要排除/home/data目录下面的a.b.c.三个目录,同时拷贝其它所有目录,执行rsync命令yum install rsync -y #安装rsync 排除单个文件/目录rsync -avP ...

  4. vue项目 - 自定义数字输入指令 | 限制自定义小数位输入

    1.在main.js中直接加入代码: import Vue from 'vue' Vue.directive("input-limit", { bind(el, binding) ...

  5. mybatis_19

    id username birthday sex address 1 王五 2 10 张三 2014-07-10 1 北京市 16 张小明 1 河南郑州 22 陈小明 1 河南郑州 24 张三丰 1 ...

  6. GRAPH ATTENTION NETWORKS(GAT)图注意力网络

    摘要: 我们提出一个图注意力网络,一个新的用来操作图结构数据的神经网络结构,它利用"蒙面"的自我注意力层来解决基于图卷积以及和它类似结构的短板.通过堆叠一些层,这些层的节点能够参与 ...

  7. IBM 双队列管理器,双向传输

    1. 建立队列管理器 建立[test01][test02]两个队列管理器,一直下一步即可,端口号不能一致(需要记住设置的端口号,后面会用到) [test01]端口号 1414 [test02]端口号 ...

  8. lua的一些封装方法

    获取点击屏幕坐标 1 function getTouchPosition() 2 local locationX, locationY 3 4 local listener = cc.EventLis ...

  9. flutter系列之:创建一个内嵌的navigation

    目录 简介 搭建主Navigator 构建子路由 总结 简介 我们在flutter中可以使用Navigator.push或者Navigator.pushNamed方法来向Navigator中添加不同的 ...

  10. Spring Cloud 学习笔记(周阳)

    参考博客:https://blog.csdn.net/u011863024/article/details/114298270 内容:netflix,alibaba