Lucas 是一种用来求解 C n m m o d p C_n^m \mod p Cnmmodp( p p p 为质数)的算法。
利用 exLucas 可以求解 p p p 不为质数的情况。
Lucas
前置知识:
-
求乘法逆元
-
暴力求组合数
这种算法是基于 Lucas 定理的:
设 p p p 为素数,将正整数 n , m n,m n,m 表示为 p p p 进制如下:
n = ( n 0 n 1 … n k ‾ ) p , m = ( m 0 m 1 … m k ‾ ) p n=(\overline{n_0n_1\dots n_k})_p,m=(\overline{m_0m_1\dots m_k})_p n=(n0n1…nk)p,m=(m0m1…mk)p
其中允许首位为零,且规定当 m > n m>n m>n 时 C n m = 0 C_n^m=0 Cnm=0,则:
C n m ≡ C n 0 m 0 ⋅ C n 1 m 1 ⋅ ⋯ ⋅ C n k m k ( m o d p ) C_n^m\equiv C_{n_0}^{m_0}\cdot C_{n_1}^{m_1}\cdot \dots \cdot C_{n_k}^{m_k} (\mod p\ ) Cnm≡Cn0m0⋅Cn1m1⋅⋯⋅Cnkm