什么是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. Nginx版本。

    Nginx官网提供了三个类型的版本Mainline version:Mainline 是 Nginx 目前主力在做的版本,可以说是开发版Stable version:最新稳定版,生产环境上建议使用的版 ...

  2. maven使用junit测试报class not found

    突然就找不到类,查了一下是因为使用了Clean的命令,把编译好的class文件清理掉了,在Maven中使用test进行测试就可以了

  3. postman打开白屏

    1.打开高级系统设置:2.在"高级"选项卡中,单击"环境变量":3.添加一个新的系统变量:POSTMAN_DISABLE_GPU=true4.关闭Postman ...

  4. Mapper method 'org.lin.hms.dao.IndentDAO.insertIndent' has an unsupported return type: interface java.util.List

    出现这种错误,说明sql语句执行成功,只是返回类型出了问题. 解决办法: mapper文件中的update,delete,insert语句是不需要设置返回类型的,它们都是默认返回一个int ,所以把返 ...

  5. Hash中的bucket什么意思?

    这个好理解.无序容器的内部是由一个个的bucket(桶)构成的,每个bucket里面由相同hash的元素构成. 因此无序容器的搜索是先根据hash值,定位到bucket,然后再在bucket里面搜索符 ...

  6. PYinstall打包程序出现编码错误的解决 'utf-8' codec can't decode byte 0xce in position 171: invalid continuation b

    网上说,先执行,再打包 chcp 65001 试过没有用. 解决方案: 把import的包批量注释,然后寻找是import那个文件导致. 虽然注释会导致程序运行出错,但是打包才不管你能不能运行. 最后 ...

  7. [Unity移动端]Mono与IL2Cpp

    参考链接: https://blog.csdn.net/linxinfa/article/details/87358809 https://blog.csdn.net/Aison_/article/d ...

  8. typescript 的动态引入组件

    环境: Arco Pro + Vue3 vite自身对动态字符串形式的组件引入是有限制的, 以下写法会报错 官方文档中也对此有做说明, 只能通过固定形式去引用 以下形式不会报错, 但这种固定格式的局限 ...

  9. Linux部署JDK教程

    上一次说了windows下的jdk部署,这一次记录下Linux下的jdk部署,恰巧遇到一篇写的很清楚的教程,我就直接转过来啦,哈哈.. 一. 解压安装jdk 在shell终端下进入jdk-6u14-l ...

  10. Android进度表示

    在连接上数据库之后,一切都变得简单了呢! 开心,很轻松地就能够将APP里面的相关内容写完啦! 尝试了好久的连接Mysql数据库,最后还是没有成功: 虽然Android studio里面自带的SQLit ...