组合数
一、定义法直接根据定义做(可是这样阶乘很容易就爆了int)
Cmn=n!m!∗(n−m)!
二、递推
根据杨辉三角根据一个式子:
Cmn=Cmn−1+Cm−1n−1
这样就能递推从前一个递推出来
for(int i = 1; i <= 2000; i ++) {
c[i][1] = i % k;
c[i][i] = 1;
for(int j = 2; j < i; j ++) {
c[i][j] = (c[i - 1][j - 1]+ c[i - 1][j]) % k;
}
}
三、卢卡斯定理
Cmnmodp=Cm/pn/p∗Cmmodpnmodpmodp
四、逆元 + 费马小定理
费马小定理优化求逆元的过程 ap−1≡1modp
因为 ap−1=a∗ap−2
得出 a∗ap−2≡1modp 易知 ap−2 就是a的逆元