卢卡斯(Lucas)定理

这篇博客以易懂的方式介绍了Lucas定理,主要用于大组合数取膜,特别是当质数p很小的情况。文章指出Lucas定理可以通过递归实现,并引入了逆元的概念来处理模运算中的除法问题。还提到了费马小定理在求逆元中的应用,以及快速幂算法在计算中的作用。最后给出了组合数计算的代码实现,但警告Lucas定理仅适用于模数为质数且不超过1e6的情况。
摘要由CSDN通过智能技术生成

看了看网上关于 L u c a s Lucas Lucas 的讲解,感觉很多充斥着大量难懂的公式,对于小学生初学者来说不太友好,于是决定写一篇没有任何算法数学基础的人都能看懂的 L u c a s Lucas Lucas 。(当然本文中也会出现一些公式,不过没有 ∑ \sum 这种令人难受的符号而且公式大多特别简单)

L u c a s Lucas Lucas 定理主要用于大组合数取膜。

他的结论很简单:当且仅当 p p p 为质数时, C m n   m o d   p = C m   m o d   p n   m o d   p × C m ÷ p n ÷ p   m o d   p C_m^n\, mod\,p = C_{m\,mod\,p}^{n\, mod\, p} \times C_{m\div p}^{n\div p}\,mod\,p Cmnmodp=Cmmodpnmodp×Cm÷pn÷pmodp

由于作者太弱并不会证明,如果对恶心的证明感兴趣可以左转百度。

n , m n,m n,m 很大而 p p p 又很小的时候就可以使用 L u c a s Lucas Lucas 定理。

写个递归就可以实现 L u c a s Lucas Lucas 定理啦(本文所有代码均默认已经添加了typedef long long ll)!

inline ll Lucas(ll m, ll n) {
   
	return n == 0 ? 1 : C(m % p, n % p) * Lucas(m / p, n / p) % p;
}

慢着,你以为这就完了?

L u c a s Lucas Lucas 函数已经很优秀了,可是组合数如果按照杨辉三角计算…… L u c a s Lucas Lucas 复杂度+n。

按公式计算呢?炸了

这里科普一个叫逆元的东西,它是拿来干啥的呢?

我们知道:

( a + b )   m o d   p = ( a   m o d   p + b   m o d   p )   m o d   p (a+b)\,mod\,p=(a\,mod\,p+b\,mod\,p)\,mod\,p (a+b)modp=(amodp+bmodp)modp
( a + b )   m o d   p = ( a   m o d   p − b   m o d   p + p )   m o d   p (a+b)\,mod\,p=(a\,mod\,p-b\,mod\,p + p)\,mod\,p (a+b)modp=(amodpbmodp+p)modp
( a × b )   m o d   p = ( a   m o d   p × b   m o d   p )   m o d   p (a\times b)\,mod\,p=(a\,mod\,p\times b\,mod\,p)\,mod\,p (a×<

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值