乘法逆元作用:乘法逆元最大的作用就是,在要除以一个数,再取模时,把除法变成乘法运算,然后再取模。因为除法,比如用 16/5 应该是3.2,但是计算机会算成 3 有误差,用double就更不用说了,数大了一定有误差,所以,有了逆元!
模版代码:
// 快速模幂(配合:费马小定理) ll qpow(ll a,ll b) { ll ans=1; a=a%mod; while(b) { if(b&1) ans=ans*a%mod; b>>=1; a=a*a%mod; } return ans; } // 扩展欧几里德 void extgcd(ll a,ll b,ll& d,ll& x,ll& y){ if(!b){ d=a; x=1; y=0;} else{ extgcd(b,a%b,d,y,x); y-=x*(a/b); } } ll inverse(ll a,ll n){ ll d,x,y; extgcd(a,n,d,x,y); return d==1?(x+n)%n:-1; } int main() { // 费马小定理+快速幂(O(log2N))(mod 为素数 + mod较大时推荐):用 b^(M-2) 代替 1/b b=qpow(b,mod-2); // 扩展欧几里德(O(lnN))(GCD是否为1,1存在逆元,非1不存在逆元) b=inverse(b,mod); return 0; }