卢卡斯定理

@Pelom  September 26, 2019

卢卡斯定理

一、卢卡斯(Lucas)定理


$$C_n^m \ (\bmod \ p)$$

1.定理

$$ \begin{aligned} & a=a_kp^k+a_{k-1}p^{k-1}+\dots+a_1p+a_0 \\ & b=b_kp^k+b_{k-1}p^{k-1}+\dots+b_1p+b_0 \end{aligned} $$

其中 $0 \le a_i,b_i \le p-1$ 为整数, $i=1,2,\dots,k$
$$C_a^b \equiv C_{a_k}^{b_k} \cdot C_{a_{k-1}}^{b_{k-1}} \cdot \dots \cdot C_{a_0}^{b_0}\ (\bmod \ p)$$

2.证明

$\because$ $p$ 为素数
$\therefore$ 对于 $1 \le i \le p-1$ ,有 $$C_p^i=\frac{p}{i} C_{p-1}^{i-1} \equiv 0 \ (\bmod \ p)$$
二项式定理
$$(1+x)^p=\sum\limits_{i=0}^p C_p^ix^i \equiv 1+x^p \ (\bmod \ p)$$
算术基本定理
$$(1+x)^a=\prod\limits_{i=0}^p ((1+x)^{p^i})^{a_i} \equiv \prod\limits_{i=0}^p (1+x^{p^i})^{a_i} \ (\bmod \ p)$$
二项式定理,对比系数得
$$C_a^b \equiv C_{a_k}^{b_k} \cdot C_{a_{k-1}}^{b_{k-1}} \cdot \dots \cdot C_{a_0}^{b_0}\ (\bmod \ p)$$

int fac[N];
inline int Pow(int a,int b,int p){
    int res=1;
    for(b%=p;b;b>>=1){
        if(b&1)
            (res*=a)%=p;
        (a*=a)%=p;
    }
    return res;
}
inline int C(int n,int m,int p){
    if(n<m)
        return 0;
    return ((fac[n]*Pow(fac[m],p-2,p))%p*Pow(fac[n-m],p-2,p)%p)%p;
}
int Lucas(int n,int m,int p){
    if(m==0)
        return 1;
    return C(n%p,m%p,p)*Lucas(n/p,m/p,p)%p;
}
inline void calcFac(int p){
    fac[0]=1;
    for(int i=1;i<=p;i++)
        fac[i]=(fac[i-1]*i)%p;
}

添加新评论