在取模运算中,对于取模运算中 +、- 、* 运算是没有错误的,所以直接相除再取模的结果不一定就是正确的。
故在计算 (b/a)%m 时,我们利用a的逆元,那么结果就是:(b*(a的逆元))%m,将除法很巧妙的变成了乘法。
求逆元模板如下:
// inv 的参数 b 为 mod (即 quickpow 里面的 c)
long long quickpow(long long a, long long b, long long c) {
if (b < 0) return 0;
long long ret = 1;
a %= c;
while(b) {
if (b & 1) ret = (ret * a) % c;
b >>= 1;
a = (a * a) % c;
}
return ret;
}
long long inv(long long a,long long b) {
return quickpow(a,b-2,b);
}