组合数
一、定义法直接根据定义做(可是这样阶乘很容易就爆了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的逆元