【组合数学】 卢卡斯定理详解(证明+模板) |
您所在的位置:网站首页 › 组合的计算公式证明 › 【组合数学】 卢卡斯定理详解(证明+模板) |
文章目录
一.引入二.卢卡斯定理的证明三.模板四.时间复杂度分析五.练手题目
一.引入
1.组合数 C n m C_n^m Cnm是一类增长速度非常快的数, C 300 150 C_{300}^{150} C300150就已经是一个90位的数了,当m,n取 1 0 9 10^9 109级别甚至更大的数时,其组合数肯定难以计算了,所以做题时常常会需要组合数对一个数取模。而卢卡斯定理在这种情况下就派上了用场。 2.卢卡斯定理的应用:在m,n很大的时候,快速求解 C n m % p C_n^m\%p Cnm%p 3.卢卡斯定理的具体表述: C n m = C a 0 b 0 ⋅ C a 1 b 1 ⋅ C a 2 b 2 ⋅ ⋅ ⋅ C a k b k C^m_n=C^{b_0}_{a_0}\cdot C^{b_1}_{a_1}\cdot C^{b_2}_{a_2}\cdot\cdot\cdot C^{b_k}_{a_k} Cnm=Ca0b0⋅Ca1b1⋅Ca2b2⋅⋅⋅Cakbk(mod p) = ∏ i = 0 k C a i b i =\prod_{i=0}^{k} C^{b_i}_{a_i} =∏i=0kCaibi (mod p) (mod p)表示只是在模p的条件下成立 其中 n = a 0 + a 1 p + a 2 p 2 + ⋅ ⋅ ⋅ + a k p k n=a_0+a_1p+a_2p^2+\cdot\cdot\cdot+a_kp^k n=a0+a1p+a2p2+⋅⋅⋅+akpk, m = b 0 + b 1 p + b 2 p 2 + ⋅ ⋅ ⋅ + b k p k m=b_0+b_1p+b_2p^2+\cdot\cdot\cdot+b_kp^k m=b0+b1p+b2p2+⋅⋅⋅+bkpk 即将m,n按p进制展开 4.卢卡斯定理的等价式子: 这个式子和上面的式子是完全等价的,而且也是在编程中更常用的,因为可以通过函数递归来实现: C n m = C n % p m % p ⋅ C n / p m / p C_n^m=C_{n\%p}^{m\%p}\cdot C_{n/p}^{m/p} Cnm=Cn%pm%p⋅Cn/pm/p ( mod p) 这里的/是向下取整的 证明很简单,和进制转换的模n取余法是一样的: n = a 0 + a 1 p + a 2 p 2 + ⋅ ⋅ ⋅ + a k p k n=a_0+a_1p+a_2p^2+\cdot\cdot\cdot+a_kp^k n=a0+a1p+a2p2+⋅⋅⋅+akpk n%p即 a 0 a_0 a0 ,因为多项式中其他的项都至少含有一个p,也就是p的倍数。 n/p即 a 1 + a 2 p + a 3 p 2 + ⋅ ⋅ ⋅ + a k p k − 1 a_1+a_2p+a_3p^2+\cdot\cdot\cdot+a_kp^{k-1} a1+a2p+a3p2+⋅⋅⋅+akpk−1 不断重复上述过程即将, C n m C_n^m Cnm转化成了卢卡斯定理表达的那样。 可以发现,在经过卢卡斯定理的化简后,我们只需要不断求 C n % p m % p C_{n\%p}^{m\%p} Cn%pm%p即可,大大减小了运算量。 二.卢卡斯定理的证明1.同余: 两个整数a、b,若它们除以整数m所得的余数相等,则称a与b对于模m同余。 记作:a≡b (mod m), 2.证明 ( 1 + x ) p (1+x)^p (1+x)p≡ 1 + x p 1+x^p 1+xp(mod p) (前提:p为素数) ①将 ( 1 + x ) p (1+x)^p (1+x)p按二项式展开,得: ( 1 + x ) p = C p 0 x 0 + C p 1 x + C p 2 x 2 + C p 3 x 3 + ⋅ ⋅ ⋅ + C p k x k + ⋅ ⋅ ⋅ + C p p x p (1+x)^p=C^0_px^0+C^1_px+C^2_px^2+C^3_px^3+\cdot\cdot\cdot+C^k_px^k+\cdot\cdot\cdot+C^p_px^p (1+x)p=Cp0x0+Cp1x+Cp2x2+Cp3x3+⋅⋅⋅+Cpkxk+⋅⋅⋅+Cppxp 其中 C p 0 x 0 = 1 , C p p x p = x p C^0_px^0=1, C^p_px^p=x^p Cp0x0=1,Cppxp=xp 所以我们可以将这个式子写成: 1 + C p 1 x + C p 2 x 2 + C p 3 x 3 + ⋅ ⋅ ⋅ + C p k x k + ⋅ ⋅ ⋅ + x p 1+C^1_px+C^2_px^2+C^3_px^3+\cdot\cdot\cdot+C^k_px^k+\cdot\cdot\cdot+x^p 1+Cp1x+Cp2x2+Cp3x3+⋅⋅⋅+Cpkxk+⋅⋅⋅+xp ②由 C p i ( i ∈ [ 1 , n ] ) = p ! i ! ⋅ ( p − i ) ! C_p^i (i∈[1,n])=\frac{p!}{i!\cdot(p-i)!} Cpi(i∈[1,n])=i!⋅(p−i)!p!可得,当p为素数时,由于其分子中含有p,其必然是p的倍数,即 C p i C_p^i Cpi%p==0。(注:若p为合数,则将被分母中的数约掉,这也解释了卢卡斯定理为什么要求p必须为素数) 所以除了第一项和最后一项(也就是1和 x p x^p xp), ( 1 + x ) p (1+x)^p (1+x)p的二项展开式中其他几项都%p==0。 ③同余相加定理: 若a≡b(mod m),c≡d(mod m),则a+c≡b+d(mod m) 因为 C p i C_p^i Cpi%p=0 ,可以记为 C p i C_p^i Cpi≡0 (mod p) 所以二项展开式中间的几项在%p的意义上其实相当于0 所以: ( 1 + x ) p (1+x)^p (1+x)p≡ 1 + x p 1+x^p 1+xp(mod p) 证毕 3.证明 C n m = C n % p m % p ⋅ C n / p m / p C_n^m=C_{n\%p}^{m\%p}\cdot C_{n/p}^{m/p} Cnm=Cn%pm%p⋅Cn/pm/p ( mod p) 注:上面的/是计算机意义上的除以,即舍弃余数(向下取整) 令n=sp+q , m=tp+r 其中q,r就是n和m 除以p 的余数 而s,t就是n,m除以p后截断的部分(向下取整) 那么我们要证明的就是 C n m = C q r ⋅ C s t C_n^m=C_q^{r}\cdot C_{s}^{t} Cnm=Cqr⋅Cst( mod p) : 对于 ( 1 + x ) n (1+x)^n (1+x)n, C n m C^m_n Cnm就是其指数为 x m x^m xm的项的系数 ① 先化简: ( 1 + x ) n = ( 1 + x ) s p + q = [ ( 1 + x ) p ] s ⋅ ( 1 + x ) q (1+x)^n=(1+x)^{sp+q}=[(1+x)^p]^s\cdot(1+x)^q (1+x)n=(1+x)sp+q=[(1+x)p]s⋅(1+x)q ②在同余意义下: 上 式 ≡ ( 1 + x p ) s ⋅ ( 1 + x ) q 上式≡(1+x^p)^s\cdot(1+x)^q 上式≡(1+xp)s⋅(1+x)q ( mod p) ③再将 ( 1 + x p ) s ⋅ ( 1 + x ) q (1+x^p)^s\cdot(1+x)^q (1+xp)s⋅(1+x)q二项式展开得: [ 1 + C s 1 x p + C s 2 x 2 p + C s 3 x 3 p + ⋅ ⋅ ⋅ ] ⋅ [ 1 + C q 1 x + C q 2 x 2 + C q 3 x 3 + ⋅ ⋅ ⋅ ] [1+C^1_sx^p+C^2_sx^{2p}+C^3_sx^{3p}+\cdot\cdot\cdot]\cdot[1+C^1_qx+C^2_qx^2+C^3_qx^3+\cdot\cdot\cdot] [1+Cs1xp+Cs2x2p+Cs3x3p+⋅⋅⋅]⋅[1+Cq1x+Cq2x2+Cq3x3+⋅⋅⋅] ④现在我们要得到指数为 x m x^m xm的项的系数: m=tp+r,所以 x m = x t p ⋅ x r x^m=x^{tp}\cdot x^{r} xm=xtp⋅xr,因为q是一个小于p的数,所以后一个多项式,即 ( 1 + x ) q (1+x)^q (1+x)q不可能提供指数大于p的项。同理,前一个多项式,即 ( 1 + x p ) s (1+x^p)^s (1+xp)s,不可能提供指数小于p的项。 所以, x m x^m xm的系数必然为前一个多项式中 x t p x^{tp} xtp的系数乘以后一个多项式的 x r x^{r} xr系数,也就是 C q r ⋅ C s t C_q^{r}\cdot C_{s}^{t} Cqr⋅Cst ⑤综上,得证 C n m = C n % p m % p ⋅ C n / p m / p C_n^m=C_{n\%p}^{m\%p}\cdot C_{n/p}^{m/p} Cnm=Cn%pm%p⋅Cn/pm/p ( mod p) 三.模板 long long Lucas(long long n,long long m){ if(m==0) return 1; return Lucas(n/p,m/p)*C(n%p,m%p)%p; }每次只要求 C n % p m % p C_{n\%p}^{m\%p} Cn%pm%p,大大减少了计算量,至于这里的C就是计算组合数的函数 具体如下: long long C(long long n,long long m){ if(nn-m) m=n-m; long long a=1,b=1; for(int i=0;i |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |