概述
乘法逆元作用:乘法逆元最大的作用就是,在要除以一个数,再取模时,把除法变成乘法运算,然后再取模。因为除法,比如用 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;
}
最后
以上就是失眠盼望为你收集整理的ACM模版 - 求乘法逆元的全部内容,希望文章能够帮你解决ACM模版 - 求乘法逆元所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复