扩展Lucas算法
介绍:
这段内容主要是关于组合数取模的数学知识介绍:
- 当正整数 n , m n,m n,m很大,质数 p p p较小时,求 C n m C_{n}^{m} Cnm对 p p p取模后的值可用Lucas定理;
- 若 p p p不是质数且 m m m较小,则可以用扩展Lucas定理,注意扩展Lucas定理与Lucas定理没有一定关心,你只要学会如下知识点就可以:1.质因数分解,2.逆元 ,3.CRT(中国剩余定理) 4.组合数的定义 ,5.组合数的定义。
第一步:中国剩余定理
设 p = p 1 r 1 p 2 r 2 ⋯ p k r k p = p_{1}^{r_{1}} p_{2}^{r_{2}} \cdots p_{k}^{r_{k}} p=p1r1p2r2⋯pkrk,其中 p i p_{i} pi为质数。我们可以先求出 C n m % p 1 r 1 C_{n}^{m} \%p_{1}^{r_{1}} Cnm%p1r1, C n m % p 2 r 2 C_{n}^{m} \%p_{2}^{r_{2}} Cnm%p2r2, ⋯ \cdots ⋯, C n m % p k r k C_{n}^{m} \%p_{k}^{r_{k}} Cnm%pkrk的值 a 1 , a 2 , ⋯ , a k a_{1},a_{2},\cdots,a_{k} a1,a2,⋯,ak。
我们把 C n m C_{n}^{m} Cnm看作未知数x,可以得到以下方程组:
{ x ≡ a 1 ( m o d p 1 r 1 ) x ≡ a 2 ( m o d p 2 r 2 ) x ≡ a 3 ( m o d p 3 r 3 ) ⋯ ⋯ x ≡ a n ( m o d p k r k ) \begin{cases} x \equiv a_{1} \pmod {p_{1}^{r_{1}}}\\ x \equiv a_{2} \pmod {p_{2}^{r_{2}}}\\ x \equiv a_{3} \pmod {p_{3}^{r_{3}}}\\ \cdots\cdots\\ x \equiv a_{n} \pmod {p_{k}^{r_{k}}} \end{cases} ⎩ ⎨ ⎧x≡a1(modp1r1)x≡a2(modp2r2)x≡a3(modp3r3)⋯⋯x≡an(modpkrk)
利用中国剩余定理,我们可以求出 a i a_i ai,它是以 p i r i p^{r_i}_i piri为周期出现的无穷多个解。而在 [ 0 , p i r i ) [0,p^{r_i}_i) [0,piri)这个周期的解,就是 C n m C_{n}^{m} \ % p Cnm 后的值。
那么 a 1 , a 2 ⋯ , a k a_{1},a_{2}\cdots,a_{k} a1,a2⋯,ak怎么求呢?
第二步:组合数模质数的幂
假设我们现在要求
C n m m o d P k ( [ P ∈ prime ]