有时候在计算组合数的时候会经常用n!的逆元,如果n<=1e5左右的话,其实可以O(n)预处理出来的,当然一般MOD是1e9+7
代码也不难写:
Fac[0] = 1;
for (int i = 1; i <= N; i++) Fac[i] = (Fac[i-1] * i) % MOD;
Inv[N] = pow_mod(Fac[N], MOD-2);//Fac[N]^{MOD-2}
for (int i = N - 1; i >= 0; i--) Inv[i] = Inv[i+1] * (i + 1) % MOD;
然后在使用的时候是直接return Fac[N]*Inv[M]%MOD*Inv[N-M]%MOD;//计算C(N, M),注意不要溢出
如果MOD比N要小的话要注意了,因为如果Inv[i+1] = 0的话会导致推到前面都是0了,另外虽然没有深究过,但是觉得在这种情况下这个效果不是非常好,
所以这种预处理就暂时只用在MOD是1e9+7 或 1e9+9上。(就本人)
时间: 2024-11-13 10:14:15