Lucas定理——定义、证明、实现、运用
什么是Lucas定理
这是一个有助于分解组合数来求解的定理,适合模数小,数字大的问题。
有质数 \(p\),对于\(n,m\),如果\(n=k_1p+b_1,m=k_2p+b_2\),有
\]
由此可以分解成较小的问题求解。
证明Lucas定理
这个证明利用了二项式定理的思路,前所未闻,真的很有趣。
根据二项式定理可以得到 \((1+x)^n\)中\(x^m\)的系数为\(C_n^m\)。
我们用这一点作为突破口,对于\((1+x)^n\),我们有
\]
然后有一个很有意思的东西
\]
为什么呢?将式子拆开后,显然除了第一项与最后一项,其他项是\(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\),我们得到
\]
由此,完成了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定理——定义、证明、实现、运用的更多相关文章
- xdoj-1057(Lucas定理的证明及其模板)
Lucas定理的证明: 转自百度百科(感觉写的还不错) 首先你需要这个算式: ,其中f > 0&& f < p,然后 (1 + x) nΞ(1 + x) sp+q Ξ ...
- lucas定理的证明
http://baike.baidu.com/link?url=jJgkOWPSRMobN7Zk4kIrQAri8m0APxcxP9d-C6qSkIuembQekeRwUoEoBd6bwdidmoCR ...
- 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])* ...
- Lucas定理学习笔记
从这里开始 一个有趣的问题 扩展Lucas算法 一个有趣的问题 题目大意 给定$n, m, p$,求$C_{n}^{m}$除以$p$后的余数. Subtask#1 $0\leqslant m\leq ...
- 『Lucas定理以及拓展Lucas』
Lucas定理 在『组合数学基础』中,我们已经提出了\(Lucas\)定理,并给出了\(Lucas\)定理的证明,本文仅将简单回顾,并给出代码. \(Lucas\)定理:当\(p\)为质数时,\(C_ ...
- 初等数论及其应用——Lucas定理
Lucas定理用于解决较大组合数的取模问题,下面的理论整理源自冯志刚的<初等数论>,其与百度百科上呈现的Lucas定理形式上不同,但是容易看到二者的转化形式. 首先我们来整理一下冯志刚的& ...
- lucas定理 +证明 学习笔记
lucas定理 p为素数 \[\dbinom n m\equiv\dbinom {n\%p} {m\%p} \dbinom {n/p}{m/p}(mod p)\] 左边一项直接求,右边可递归处理,不包 ...
- 【luogu P3807】【模板】卢卡斯定理/Lucas 定理(含 Lucas 定理证明)
[模板]卢卡斯定理/Lucas 定理 题目链接:luogu P3807 题目大意 求 C(n,n+m)%p 的值. p 保证是质数. 思路 Lucas 定理内容 对于非负整数 \(n\),\(m\), ...
- 组合数取模Lucas定理及快速幂取模
组合数取模就是求的值,根据,和的取值范围不同,采取的方法也不一样. 下面,我们来看常见的两种取值情况(m.n在64位整数型范围内) (1) , 此时较简单,在O(n2)可承受的情况下组合数的计算可以 ...
- Lucas定理及其应用
Lucas定理这里有详细的证明. 其实就是针对n, m很大时,要求组合数C(n, m) % p, 一般来说如果p <= 10^5,那么就能很方便的将n,m转化为10^5以下这样就可以按照乘法逆元 ...
随机推荐
- Do whlie 循环
Do whlie 循环 ◆对于while语句而言,如果不满足条件,则不能进入循环.但有时候我们需要即使不满足条件,也至少执行-次. ◆do...while循环和while循环相似,不同的是,do... ...
- 【转载】PostgreSQL逻辑订阅logical
原文地址:https://blog.csdn.net/gguxxing008/article/details/106356086 逻辑订阅是PostgreSQL10.0开始支持的新功能,Postgre ...
- python 猜数字
方法一 import randomif __name__ == '__main__': yourname = input("你好! 你的名字是什么?\n"); prin ...
- [扫描工具]dirsearch简单使用
[扫描工具]dirsearch简单使用 dirsearch是一个python开发的目录扫描工具.和我们平时使用的dirb.御剑之类的工具一样,就是为了扫描网站的敏感文件和目录从而找到突破口. 安装: ...
- 理解Map-构建关联数组
理解Map 要更深入理解map,学习如何构建关联数组是很有帮助的,以下是简单实现 package org.example.onjava.senior.example03collection.map; ...
- 记录一次线上gitlab11.x升级gitlab14.x版本操作
前言:gitlab11升级到14还是有挺多需要注意的坑,也算是做一次积累吧,升级前后,gitalb的WEB界面也变化了很多,升级过程需要注意的地方我放到最后说明,挺关键的 一.首先需要下载好要升级的包 ...
- 详解AQS的7个同步组件
摘要:AQS的全称为Abstract Queued Synchronizer,是在J.U.C(java.util.concurrent)下子包中的类. 本文分享自华为云社区<[高并发]AQS案例 ...
- SpringBoot笔记--自动配置(高级内容)(中集)
@Enable*注解 使用该注解,需要导入相应的依赖坐标,其中的groupId标签里面写入Bean的Java文件所在的包的路径下面 spring-enable-other 还需要在SpringBoot ...
- 使用python爬虫爬取链家潍坊市二手房项目
使用python爬虫爬取链家潍坊市二手房项目 需求分析 需要将潍坊市各县市区页面所展示的二手房信息按要求爬取下来,同时保存到本地. 流程设计 明确目标网站URL( https://wf.lianjia ...
- 自己动手从零写桌面操作系统GrapeOS系列教程——18.外设和IO
学习操作系统原理最好的方法是自己写一个简单的操作系统. 一.外设和I/O接口 前面我们介绍过冯·诺依曼结构包含5部分,其中输入设备和输出设备统称为外部设备,简称外设.常见的外设有鼠标.键盘.显示器.硬 ...