我是靠谱客的博主 失眠盼望,这篇文章主要介绍ACM模版 - 求乘法逆元,现在分享给大家,希望可以做个参考。

乘法逆元作用:乘法逆元最大的作用就是,在要除以一个数,再取模时,把除法变成乘法运算,然后再取模。因为除法,比如用 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模版内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部