Lucas定理和拓展Lucas定理

用途

对于一个组合数求值的问题,一般运用阶乘来求,但有时候阶乘太大,就会超时。

L u c a s Lucas Lucas 定理和拓展 L u c a s Lucas Lucas 定理就是用来解决在模意义下求值的问题。(但有个前提,就是你的模数必须比较小,否则也做不了)

L u c a s Lucas Lucas 定理

原理

对于 n , m , p n, m, p n,m,p p p p 为质数),我们假设 n > m n > m n>m k p + r = n , b p + c = m kp+r=n,bp+c=m kp+r=n,bp+c=m ,其中 0 ≤ r < p , 0 ≤ c < p 0\leq r < p,0\leq c <p 0r<p,0c<p ,则有:

( n m ) ≡ ( k b ) ( r c )     ( m o d   p ) {n\choose m}\equiv{k\choose b}{r\choose c} \ \ \ (mod\ p) (mn)(bk)(cr)   (mod p)

于是我们设 a i , b i a_i,b_i ai,bi n , m n,m n,m 转化成 p p p 位数后的第 i i i 位的值(从低位到高位),将上面式子递归下去,则有:

( n m ) ≡ ( a 1 b 1 ) ( a 2 b 2 ) ⋯ ( a c n t b c n t )     ( m o d   p ) {n\choose m} \equiv {a_1\choose b_1}{a_2\choose b_2}\cdots{a_{cnt}\choose b_{cnt}}\ \ \ (mod\ p) (mn)(b1a1)(b2a2)(bcntacnt)   (mod p)

证明

一下式子都是在模 p p p 意义下进行的, k , r , b , c k,r,b,c k,r,b,c 意义同上。

我们现在只需要证明第一个式子,则可以证明 L u c a s Lucas Lucas 定理。

根据二项式定理,我们知道 ( 1 + x ) n (1 + x) ^ n (1+x)n m m m 项的系数为 ( n m ) {n\choose m} (mn)

所以:

( 1 + x ) n ≡ ( 1 + x ) k p + r ≡ ( 1 + x ) k p ( 1 + x ) r ≡ ( ( 1 + x ) p ) k ( 1 + x ) r (1 + x) ^ n \equiv (1 + x) ^{kp+r} \equiv (1+x)^{kp}(1 + x) ^r\equiv((1+x)^p)^k(1+x)r (1+x)n(1+x)kp+r(1+x)kp(1+x)r((1+x)p)k(1+x)r

此时我们来看 ( 1 + x ) p (1+x)^p (1+x)p ,对于 0 < i < p 0<i<p 0<i<p 时,第 i i i 项的系数 ( p i ) p\choose i (ip) 都是 p p p 的倍数,所以在模 p p p 意义下等于零,则可以继续推导为:

( ( 1 + x ) p ) k ( 1 + x ) r ≡ ( 1 + x p ) k ( 1 + x ) r ≡ ∑ i = 0 k ( k i ) x p i ∑ j = 0 r ( r j ) x j ((1+x)^p)^k(1+x)r\equiv(1+x^p)^k(1+x)^r\equiv\sum_{i=0}^k{k\choose i}x^{pi}\sum_{j = 0}{r}{r\choose j}x^j ((1+x)p)k(1+x)r(1+xp)k(1+x)ri=0k(ik)xpij=0r(jr)xj

因为 r < p r < p r<p ,所以 j < p j < p j<p ,此时第 m m m 项(也就是 x m x^m xm) 的系数如下:

( k b ) ( r c ) {k\choose b}{r\choose c} (bk)(cr)

因为对于任意一个 m m m ,有且仅有一种 b , c b,c b,c 的取值与它对应,所以在上面的式子中,当 i = b , j = c i=b,j=c i=b,j=c 时,就是 x m x^m xm 的系数。

我们刚开始根据二项式定理知道 x m x^m xm 的系数的另一种形式,则有:

( n m ) ≡ ( k b ) ( r c ) {n\choose m}\equiv{k\choose b}{r\choose c} (mn)(bk)(cr)

第一个式子得证。

拓展 L u c a s Lucas Lucas 定理

L u c a s Lucas Lucas 定理中,我们要求模数 p p p 一定得是质数,但如果模数 p p p 不是质数呢?

我们将 ( n m ) n\choose m (mn) 设为 a n s ans ans

我们先将 p p p 质因数分解为 p 1 a 1 p 2 a 2 ⋯ p k a k p_1^{a_1}p_2^{a_2}\cdots p_k^{a_k} p1a1p2a2pkak

此时我们对于每个 ( n m ) % p i a i {n\choose m}\% p_i^{a_i} (mn)%piai 都求出它的值 d i d_i di 。根据中国剩余定理,列出方程组:

{ a n s ≡ d 1     ( m o d   p 1 a 1 ) a n s ≡ d 2     ( m o d   p 2 a 2 ) ⋮ a n s ≡ d k     ( m o d   p k a k ) \left\{ \begin{array}{} ans\equiv d_1\ \ \ (mod\ p_1^{a_1})\\ ans\equiv d_2\ \ \ (mod\ p_2^{a_2})\\ \vdots \\ ans\equiv d_k\ \ \ (mod\ p_k^{a_k})\\ \end{array} \right. ansd1   (mod p1a1)ansd2   (mod p2a2)ansdk   (mod pkak)

如果这个方程组有解,我们就可以求出来 a n s ans ans 了。

接下来的问题就变成了如何求 d i d_i di 了。

d i ≡ ( n m ) ≡ n m ‾ m !     ( m o d   p i a i ) d_i \equiv {n\choose m} \equiv \dfrac{n^{\underline m}}{m!}\ \ \ (mod\ p_i^{a_i}) di(mn)m!nm   (mod piai)

我们可以将分子和分母中所有的因数 p i p_i pi 取出来,约分,接下来就可以用逆元来做了。

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值