lucas定理一般用来解决如下问题:
Lucas 定理用于求解大组合数取模的问题,其中 p 必须为素数。正常的组合数运算可以通过递推公式求解(详见 排列组合 ),但当问题规模很大,而模数是一个不大的质数的时候,就不能简单地通过递推求解来得到答案,需要用到 Lucas 定理。
以上摘自oi wiki。
lucas定理内容如下:
[{nchoose m}equiv {lfloorfrac{n}{p}
floorchoose lfloorfrac{m}{p}
floor}cdot {n\% pchoose m \%p}(mod p)
]
其实也可以写为:
[{nchoose m}equiv prod_{i=0}^k{n_ichoose m_i}(mod p)
]
其中(n_i,m_i)分别为(n,m)拆分为(p)进制后,每一位对应的值。
接下来说一下定理内容的证明,给大家介绍一种生成函数的做法。
首先我们注意到有这样一个恒等式:
[displaystyle (1+x)^pequiv (1+x^p)
]
证明的话也不难:
注意到(displaystyle {pchoose n}=frac{p!}{n!(p-n)!}),在模(p)意义下,显然只有(n=0)或(n=p)时这个式子值大于(0),那么(displaystyle (1+x)^p=sum_{n=0}^p{pchoose n}x^n=1+x^p)。
同理,在模(p)意义下,可推广为((a+b)^pequiv a^p+b^p(mod p))。
上述式子通过数学归纳法还可以得出这样一个等式:
[(1+x)^{p^i}equiv 1+x^{p^i}(mod p)
]
接下来证明就开始啦QAQ
我们首先有(displaystyle m=sum_{i=0}^km_ip^i),即将(m)在(p)进制下拆分。那么:
[egin{aligned}
(1+x)^m=&(1+x)^{sum_{i=0}^km_ip^i}\
=&prod_{i=0}^k(1+x)^{p^im_i}\
=&prod_{i=0}^k(1+x^{p^i})^{m_i}\
=&prod_{i=0}^ksum_{n_i=0}^{m_i}{m_ichoose n_i}x^{p^in_i}\
=&prod_{i=0}^k(sum_{n_i=0}^{p-1}{m_ichoose n_i}x^{p^in_i})
end{aligned}
]
注意到后面括起来的部分可以看作一个多项式,那么上面整个式子都是若干个多项式的乘积。
现在我们从生成函数的角度思考,发现(x)的指数部分最后乘起来是一个这样的形式:(displaystyle sum_{i=0}^k n_ip^i),显然可以发现这为某个(n)的(p)进制分解。
那么考虑枚举最后得到的(n),就有:
[egin{aligned}
&prod_{i=0}^k(sum_{n_i=0}^{p-1}{m_ichoose n_i}x^{p^in_i})\
=&sum_{n=0}^m(prod_{i=0}^k{m_ichoose n_i})x^n
end{aligned}
]
上面的(n_i)为(n)的(p)进制分解中对应的数。
那么lucas定理的内容就证明完啦。