求逆元有许多种方法,一般求单个数的逆元可以用拓展欧几里得或者费马小定理,在这里提供一种用递推关系求逆元的方法,时间复杂度是O(n),一般用于需要初始化逆元表的题目。
int fac[105];
int inv[105];
int get_inv(int n) {
if (n == 1)
return 1;
return get_inv(MOD%n)*(MOD - MOD / n) % MOD;
}
int Com(int n, int m) {
return fac[n] * inv[m] % MOD*inv[n - m] % MOD;//求组合数
}
void init() {
inv[0] = fac[0] = 1;
for (int i = 1; i<MAXN; i++) {
fac[i] = fac[i - 1] * i%MOD;//存阶乘
inv[i] = get_inv(fac[i]);//存逆元
}
}