Lucas定理解決的問題是組合數取模。數學上來說,就是求:
\[\binom n m\mod p \]
這里\(n,m\)可能很大,比如達到\(10^{15}\),而\(p\)在\(10^9\)以內。顯然運用常規的階乘方法無法直接求解,所以引入Lucas定理。
Lucas定理
把\(n\)和\(m\)寫成\(p\)進制數的樣子(如果長度不一樣把短的補成長的那個的長度):
\[n=(a_0a_1\dots a_k)_p \\ m=(b_0b_1\dots b_k)_p \]
那么:
\[\binom n m\equiv \prod _{i=0}^k\binom {a_i} {b_i}\mod p \]
證明
如果把Lucas定理從遞歸的角度理解,它其實是這樣的:
\[設n=ap+b,m=cp+d,(b,d<p,a=\lfloor\frac{n}{p}\rfloor,c=\lfloor \frac{m}{p}\rfloor) \\ \binom n m\equiv \binom a c*\binom b d \]
這個定理的一個很巧妙的證法是通過二項式定理來說明上面的式子是成立的。
首先,對於任意質數\(p\),有:
\[(1+x)^p\equiv 1+x^p\mod p \]
證明可以由費馬小定理直接得出:
\[(1+x)^p\equiv 1+x\equiv1+x^p \]
(當然同樣也有\((a+b)^p\equiv a^p+b^p\mod p\))
利用這個性質,我們證明Lucas定理:
\[\begin{aligned} (1+x)^n&=(1+x)^{\lfloor \frac{n}{p}\rfloor *p}(1+x)^b \\ &=(1+x^p)^{\lfloor \frac{n}{p}\rfloor}(1+x)^b \\ &=\sum _{i=0}^k\binom {\lfloor \frac{n}{p}\rfloor} ix^{pi}\sum _{j=0}^k\binom b jx^j \end{aligned} \]
考察等式左右兩邊\(x^m\)的系數,可以發現:
\[\begin{aligned} 左邊&=\binom n m \\ 右邊&=\binom {\lfloor \frac{n}{p}\rfloor} i\binom b j,(pi+j=m,j<p) \\ &=\binom {\lfloor \frac{n}{p}\rfloor} {\lfloor \frac{m}{p}\rfloor} \binom b d \end{aligned} \]
所以上面的式子成立,證明完畢。
算法時間復雜度為\(O(lop_pn)\),如果不算預處理什么的。如果能夠支持預處理,那么就加一個\(O(p)\),要不就用快速冪,乘上\(O(logp)\)。
拓展
求解\(p\)不是質數的情況。
一個很簡單的做法就是把\(p\)分解成多個不同素數的冪相乘,由於是多個不同素數的冪,所以可以直接運用中國剩余定理將答案合並。所以現在問題就轉化成,\(p\)為素數,求:
\[\binom n m\mod p^q \]
在這種情況下,使用階乘的方法就好。
\[\binom n m=\frac{n!}{m!(n-m)!} \]
所以問題就變成了快速求\(n!\mod p^q\)。
一個十分經典的例子是:\(19!\mod 3^2\):
\[\begin{aligned} 19!&=1*2*3*\cdots *17*18*19 \\ &=1*2*4*5*7*8*10*11*13*14*16*17*19*(3*6*9*12*15*18) \\ &=(1*2*4*5*7*8)*(10*11*13*14*16*17)*19*3^6*(1*2*3*4*5*6) \end{aligned} \]
可以注意到,我們把\(p\)的倍數提取出來,並且把它們都提出一個\(p\),那么剩下的又變成了一個階乘,可以遞歸計算。前面的部分是\(p^q\)以內循環的,即\(1*2*4*5*7*8\equiv10*11*13*14*16*17*19\mod 3^2\),所以只用算一個,快速冪一下即可。中間的那一項就直接在求組合數的時候相減即可。多出來的非循環的部分一定小於\(p^q\),所以暴力即可。求一個\(n!\mod p^q\)的復雜度為\(O(p^qlog_2n(log_pn-q))\)。
所以拓展情況帶上CRT的總復雜度為\(O(p^qlog_2n(log_pn-q)+nlog_2p)\)。