卢卡斯(Lucas)定理

news/2024/12/22 17:54:24/

引入

之前有写过一篇博客是求组合数(取模)的两种方法。那篇文章里介绍的方法其实也还有局限性,Pascal打表由于内存的限制一般只用于求取1000以内的组合数,而使用逆元套公式的方法其实也只适用于求取的组合数 C(n,m)%p 中,n 和 m均不大于要求的模数 p 。这样就导致了一个很尴尬的问题——如果要求取的组合数超过了模数p,这个时候有要怎么办呢。本人之前由于水平限制并没有了解到这个问题,前几天打玲珑杯#round 4的时候被这个问题困扰了,经队友提醒才知道有Lucas定理这种东西。这里就另写一篇文章,其实是作为之前的“组合数取模的两种方法”的一个拓展篇。将这个问题一次性终结到底。

定义、证明与方法

卢卡斯(Lucas)定理
P 为素数,a,bN ,并且

a=akpk+ak1pk1++a1p+a0b=bkpk+bk1pk1++b1p+b0

这里 0ai,bip1 都是整数, i=0,1,2,,k . 则有
CbaCbkakCbk1ak1Cb0a0(mod P)

这里还要声明一点,本篇博客的参考书籍为冯志刚版《初等数论》第37页,下面给出原书的证明:Lucas定理证明

这个定理的意义就在于把 a 或者 b 或者两者均大于 p 的组合数 Cba 转换为求解小于 p 的整数 ak bk 的组合数 Cbkak 的乘积。

而对于 a0,a1,,ak 可以通过秦九韶算法:

a=((((0p+ak))p+a2)p+a1)p+a0

逆向得到,即
a0=(a/p0)%pa1=(a/p1)%pa2=(a/p2)%pak=(a/pk)%p

显然,秦九韶的逆向算法页同样适用于求解 b .

使用解析

实际求解 Cba 时,只要 ai bi 当中有一个仍然大于 p ,就要继续使用逆向的秦九韶算法。但实际编写代码的过程,只需要递归即可:

LL Lucas(LL a, LL b)
{if(a < mod && b < mod)return C(a, b);returnC(a % mod, b % mod) * Lucas(a / mod, b / mod);
}

其中C(a, b)的函数在之前的文章求组合数(取模)的两种方法叙述过了,这里就不继续赘述了。

现在,通过pascal打表的方法在 O(1) 的时间里求得小范围的组合数,用逆元的方法可以求取模数范围内的组合数,在加上Lucas定理,就可以求取任意范围内的组合数了。

在实际运用的过程中,可以根据实际判断哪种方法最适合, a,b 的是一个主导因素,同事,算法的简单性也是一个主导因素。毕竟,越简单的东西越不容易出错。杀鸡用牛刀不是不可以,但是你想过鸡的感受么。。。

以上です~


http://www.ppmy.cn/news/581453.html

相关文章

高中孩子叛逆,家长该如何交流?

孩子高中产生逆反心理其实是一种很正常的现象&#xff0c;是人成长过程中必然会出现的情况&#xff0c;父母必须引起重视。高中的身心发展是一生中的重要时期&#xff0c;是孩子思想品质、人生观、自我意识、情绪情感、个性、人格等形成的关键时期&#xff0c;因此家长一定要做…

AI绘图高级篇 第7篇 MJ以图换图-卡通头像

大家好&#xff0c;我是菜鸟哥 这个是我们MJ系列的第7篇&#xff0c;以前在会员群里发过&#xff0c;就是把头像做成卡通或者3D的效果还是很酷&#xff0c;或者是迪斯尼风格的。其实非常简单&#xff0c;就是用了一个MJ的以图换图的功能&#xff0c;今天给大家详细的说一下。 前…

漫画 | “道德沦丧”的程序员 !

作为一个混迹在互联网金融公司的小开发&#xff0c;我写的代码每天都要和钱发生关系。 所以&#xff0c;我非常害怕自己写的代码出问题。 但是怕什么来什么&#xff0c; 这一天&#xff0c; 我发现了一个线上故障。 按照公司的处理流程&#xff0c;我立刻在故障处理总群里上报了…

COS图第四弹mdash;mdash;鲁鲁修

虽然和原版差距比较大&#xff0c;但是神态和气势倒是很有感觉&#xff0c;相当于创新了

【真题解析】系统集成项目管理工程师 2021 年上半年真题卷(综合知识)

本文为系统集成项目管理工程师考试(软考) 2021 年上半年真题(全国卷),包含答案与详细解析。考试共分为两科,成绩均 ≥45 即可通过考试: 综合知识(选择题 75 道,75分)案例分析(问答题 4 道,75分)综合知识(选择题*75)1-10 题11-20 题21-30 题31-40 题41-50 题51-60 …

java9新特性之-String存储结构变更--集合工厂方法-- InputStream 加强--增强的 Stream API讲解

String存储结构变更 Motivation The current implementation of the String class stores characters in a char array, using two bytes (sixteen bits) for each character. Data gathered from many different applications indicates that strings are a major component o…

【从零开始学习C++ | 第二十一篇】C++新增特性 (上)

目录 前言&#xff1a; 委托构造函数&#xff1a; 类内初始化&#xff1a; 空指针&#xff1a; 枚举类&#xff1a; 总结&#xff1a; 前言&#xff1a; C的学习难度大&#xff0c;内容繁多。因此我们要及时掌握C的各种特性&#xff0c;因此我们更新本篇文章&#xff0c;向…

现在企业都在强调的客户体验,如何从官网帮助文档入手?

在当前激烈的市场竞争中&#xff0c;企业已经逐渐意识到客户体验的重要性。客户体验是指通过产品和服务所提供的一系列互动和接触&#xff0c;客户对企业的全面感受和评价。而在客户体验中&#xff0c;官网帮助文档作为企业与客户之间互动的重要环节&#xff0c;也扮演着重要的…