组合数取模

组合数取模问题为求$C_{n}^m % p$的值。根据$n$,$m$,$p$取值不同,方法不同。
在此之前我们先看些前置技能:

同余定理:$a≡b(mod\ m)$
性质:
1.传递性:若$a≡b(mod\ m)$,$b≡c(mod\ m)$,则$a≡c(mod\ m)$;
2.同余式相加:若$a≡b(mod\ m)$,$c≡d(mod\ m)$,则$a±c≡b±d(mod\ m)$;
3.同余式相乘:若$a≡b(mod\ m)$,$c≡d(mod\ m)$,则$ac≡bd(mod\ m)$。

逆元(数论倒数):对于正整数$a$和$m$,如果有$ax≡1(mod\ m)$,那么把这个同余方程中$x$的最小正整数解称为$a mod\ m$的逆元。
为什么叫数论倒数呢,因为没有$mod$操作,那么$x$就相当于$a$的倒数,有$mod$操作时效果上和倒数一样。同时我们把$a$的逆元写做:$inv(a)$。
逆元求解一般用扩展欧几里得算法,如果$m$为素数,那么还可以根据费马小定理得到逆元为$a^{m-2} mod\ m$。

扩展欧几里得算法和费马小定理求解逆元具有局限性,两种算法都要求a和m互素。

1.扩展欧几里得:$a*x + b*y = 1$
解$x$就是$a$关于$b$的逆元,解$y$就是$b$关于$a$的逆元
$a*x \% b + b*y \% b = 1 \% b$
$a*x \% b = 1 \% b$
$a*x = 1 (mod\ b)$

2.费马小定理:$a\hat{}(p-1)≡1 (mod\ p)$
两边同时除以$a$,$a\hat{}(p-2)≡inv(a)(mod\ p)$;即$inv(a)≡a^(p-2)(mod\ p)$

Lucas定理:

$n=n_kp^k+n_{k-1}p^{k-1}+...+n_1p+n_0$

$m=m_kp^k+m_{k-1}p^{k-1}+...+m_1p+m_0$

得到:$C_n^m=\prod\limits_{i=0}^{k}C_{ni}^{mi}(mod\ p)$

具体代码中实现:$Lucas(n,m,p)=c(n\%p,m\%p)*Lucas(n/p,m/p,p)\%p $

猜你喜欢

转载自www.cnblogs.com/ehanla/p/9086076.html
今日推荐