对除法来说,无法直接进行取模运算,所以此时要用到逆元运算。
若a*x=1(mod p),其中gcd(a,p)=1,即a,p互质,则称x为a关于p的逆元,或者a,x关于p互为逆元。称a的逆元为inv(a),这样就将除法取模运算 (a/b)%p 转换成
(a*inv(b))%p=(a%p*inv(b)%p)%p。
方法一:根据费马小定理(快速幂)
ll inv(ll a, ll mod)// mod 必须是一个质数
{
ll ret = 1, temp = mod - 2;// ret为 a关于 mod的逆元
while (temp)
{
if (temp & 1)
ret = (ret * a) % mod;
a = (a * a) % mod;
temp >>= 1;
}
return ret;
}
方法二:
这个方法不限于求单个逆元,比上一个好,它可以在O(n)的复杂度内算出n个数的逆元。
注意:a要小于mod,传参前最好先把a%mod一下
ll inv(ll a, ll mod)
{
// 返回的值就是 a关于 mod的逆元
return a == 1 ? a : (mod - mod / a) * inv(mod % a, mod) % mod;
}
参考文档求逆元的方法及模板 - Frank__Chen - 博客园 (cnblogs.com)
初学者,见解不足,如有错误请指出