组合数学中的常见定理&组合数的计算&取模
组合数的性质:
C(n,m)=C(n,n-m);
C(n,m)=n!/(m!(n-m)!);
组合数的递推公式:
C(n,m)= C(n-1,m-1)+C(n-1,m);
组合数一般数值较大,题目会要求取模;而求组合数的过程中一般会用到除法,所以会涉及除法取模的知识;
在除法取模的过程中,一般会求一个乘法逆元;
乘法逆元的定义:满足a*k≡1 (mod p)的k值就是a关于p的乘法逆元;
求乘法逆元的方法:
(b/a)modp;(a|b)p为质数;
1.欧拉定理或者费马小定理:
费马小定理是欧拉定理的特殊情况;
费马小定理的定义及证明:链接
由得b/a=(b/a)*(ap-1modp)=b/a*ap-1modp=b*ap-2modp;
除法就被消去了;
而这样做还有一个问题就是p-2一般很大,(因为p一般都取1e9+7,NND,我记得有次BC的题是1e8+7直接把我坑惨了);这时就用快速幂求啦;
附上快速幂的模板:
ll fsat_pow(ll a,ll b) { ll s=1,base=a; while(b) { if(b&1) { s*=base; s%=mod; } base*=base; base%=mod; b=(b>>1); } return s; }
2.扩展欧几里得算法:
当n,m都很大不能一个一个数相乘得到时,这时就需要Lucas定理了;(有心情有时间再来写)