关于Lucas定理的那些事儿
闲话:
作为一名数竞生,证明一些在OI界通过猜而得到的结论是博主的一大乐趣。
于是想了想,博主决定在今天水出第一发数论随笔~~~
就讲一个在OI界和数竞界都应用广泛的定理吧
Lucas定理!!!
定理内容:
常用的Lucas定理通常是二元形式的,结论如下:
对于素数p以及整数 r1, r2(0 <= r1, r2 < p),
我们总有 C (k1*p+r1, k2*p+r2) == C (k1, k2) * C (r1, r2) (mod p);
作为一名OIer,这个结论必须牢记(后面会讲解他的用处)。
而推广到k元的Lucas定理则是这样的:
对于素数p以及整数n, m;
对n, m做关于k的如下分解,使得
n = Σ0<=i<=k ai*pi,
m = Σ0<=i<=k bi*pi,
我们总有
C (n, m) == π0<=i<=k C (ai, bi);
这个的话各位OIer尽量 掌握 了解吧 多少还是有点用的
而数竞党们如果要挑战 联赛加试数论 or CMO
这大概是同余章节需要烂熟于心的定理之一吧
(插几句闲话:
在这里博主给各位感兴趣的数论爱好读者推荐一本不错的数论书——
《命题人讲座》中的数论本,冯校长写的,
内容精简而全面,例题练习极具巧思,很有质量!
上面对费马小,欧拉,以及Lucas定理等均有详细讲解。
适合帮助广大初学者速入数论大坑!)
言归正传,咳咳;
定理背景:
既然讲完了定理内容,就讲一下别的吧。
博主并不想直接上证明,而是想要先扯一扯关于这个定理的历史。
话说博主是一个对数学史很感兴趣的OIer,
一般用一些定理啊公式啊之类的都有去了解背后的历史以及相关科学家生平的“好习惯”。
然而对于这个Lucas定理,博主真的找了很久的背景,
但真的没有一种靠谱的说法。(似乎是佚名数学家发现的?)
不过数学家 Anatole Lucas 倒是一个颇有名气的数学家,(长得真的超级像Stalin Joseph老大哥,蛤!)
他尤其擅长数论一块知识的研究。
作为Fib数列研究的先驱者,他首次得出Fib数列的通项;
并在梅森素数的研究领域,提出了一种叫做Lucas-Lehmer的梅森素数的判定法。
可谓是对近代数学数论领域做出了功不可没的贡献。
大概这个著名的数论定理就是为了纪念伟大的 Anatole Lucas 才命名为Lucas定理吧?
(话说这个数学家真的挺不容易的,膜一膜吧!)
哎。可能是因为年代原因吧。真的找不到更多资料了。遗憾……
那,背景故事就先讲到这里吧!
定理证明:
下面真的要开始 水一波 证明了。
关于证明同余的恒等式子,常用的方法就是推导同余恒等关系。
不过同学们推一推就会发现对于 Lucas定理,貌似并不能直接推导出来什么同余恒等关系。
这时,熟练的同学一定想到——
有组合数,有恒等,又不好直接推导;
显然的构造(母)函数大法好嘛!!!
如果你并不知道母函数是什么,
我建议你去买一本奥经的组合来刷。
我建议你先去看看我写的《关于构造函数解题》的随笔,
并自行在网上 or 书上 了解一下同余的基本概念和知识点。
然后你看这个定理的证明一定会没有障碍了!
那么,话不多讲,既然你已经看了我的那几篇随笔了(默认的),
我就不多做铺垫,也不细讲,直接上证明了!
证明:
由于p是素数,我们显然有当j满足1<=j<=p时,C(p, j) == C(p-1, j-1)*p/j(mod p);(组合数的递推式)
利用上面结果,立得: (1+x)n=π0<=i<=k((1+x)ai)^pi(相当于把n来进行p进制展开)
考虑n, m的p进制展开是唯一的,所以对比左右两式xb次幂的系数,即可知
C(n, m) == π0<=i<=k C(ai, bi) (mod p)
至此,即导出了所要证明的结论。
证毕。
证后小结:
其实如果有想到了去构造同余函数,Lucas定理对于数论的老手来说解起来还是得心应手的。
证明这种定理,往往要有强烈的主动构造意识,
并且熟练地掌握组合数的性质以及同余方面的各种变换。
这一类证明手段对于合格的数竞党来说是应该必备的。
(不过没看懂大可跳过证明以及我的那两篇随笔,毕竟如果不是数竞生理解起来应该会很有难度)
推论:
由此定理立即可得:当且仅当存在 i ∈ {1, 2, …, k },使得当 bi>ai时,C(n, m)==0 (mod p)。
一个直接推论便可显然的导出:
C(n, m)为奇数的充要条件是,在二进制表示下a的每一个数位的数都不小于b的相应数位的数。
这个推论在做一些(二)进制问题的时候应用非常好用。
相信对于解一些数论OI题目,或许也能够拓宽一点思路吧…(博主自己YY的)
应用:
扯了这么多Math的东东,也来说说Lucas定理在OI界的应用吧。
(请各位神仙巨佬自行跳过本段,我知道您们刷过的Lucas题肯定比本萌新做过的水还多)
先让我们想一想,这个定理我们可以怎么用这个定理?
回顾一下定理的内容:
这个定理可以把C(n, m)在模p的意义下拆分成它的p进制展开。
这意味着什么呢?
这意味着如果你要快速求C(n, m) mod p的值,
然而n, m都大得离谱,只有p在效率可以接受的范围之内。
这时候我们就应该使用Lucas定理。
使得原来要计算一个很大的n值的组合数问题,
变成了计算logpn个规模小于n的组合数的乘积。
这样的效率显然是非常优秀的!
那么既然讲到这里了,相信各位对于Lucas定理解决实际OI问题都有了一个基本了解。
那么现在?上例题吧!
请您出门右转上洛谷P2675参见本题。
附上传送咒语:https://www.luogu.org/problemnew/show/P2675
题解请您再直走后左转进入题解界面。
附上传送咒语:https://www.luogu.org/problemnew/solution/P2675
拓展:
据说Lucas定理还有拓展。
于是看了一道板子题,
上面的 NOI/NOI+/CTSC 标识把本萌新吓得光速逃了。
后来去看了一下别的Blog,发现也并不能算是定理吧,应该说是一种算法。
而且应用应该不会特别广泛
应该和咱们没有什么关系
(如果您Ag、Au、集训队的神犇,那抱歉蒟蒻刚刚真的冒犯了…(瑟瑟发抖~~~))
不过如果您仍有兴趣,没办法,博主trl,就又只好为您推荐一个Blog了
附上传送咒语:http://www.cnblogs.com/jianglangcaijin/p/3446839.html
结语:
Lucas定理真的好用。
大家掌握掌握还是很有必要的。
写了这么多,博主表示也很累。
于是决定就写到这里了。
衷心感谢您对阅读。
如果对您有帮助,博主深感荣幸。
方便的话就赏个赞呗!QAQ