用途
对于一个组合数求值的问题,一般运用阶乘来求,但有时候阶乘太大,就会超时。
而 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 0≤r<p,0≤c<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)r≡i=0∑k(ik)xpij=0∑r(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} p1a1p2a2⋯pkak。
此时我们对于每个 ( 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. ⎩ ⎨ ⎧ans≡d1 (mod p1a1)ans≡d2 (mod p2a2)⋮ans≡dk (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 取出来,约分,接下来就可以用逆元来做了。