目录
1.直接求组合数:
a是阶乘数组,预处理一下
组合数Cnm,n个里面选m个,结果为 n!/(n-m)! / m! (前者其实就是n*n-1*...*n-m+1也就是m个)
ksm快速幂求的是逆元。用的是费马小定理,适用于模数为素数的时候。
ll ksm(int x, int y, int mod)
{
if (x == 1) return 1;
ll res = 1, base = x;
while (y) {
if (y & 1) res = (res * base) % mod;
base = (base * base) % mod;
y >>= 1;
}
return res;
}
ll C(ll n, ll m, ll p)
{
if (m > n)return 0;
return ((a[n] * ksm(a[m], p - 2, p)) % p * ksm(a[n - m], p - 2, p) % p);
}
ll A(ll n, ll m, ll p)
{
if (m > n)return 0;
return (a[n] * ksm(a[n - m], p - 2, p)) % p;
}
2.递推组合数公式:
C(n, m) = C(n - 1, m) + C(n - 1, m - 1)
我们拿出一个元素,剩下n-1个。要么在 n-1 里面选 m 个,要么这个加上 n-1 里面选 m-1 个