快速幂取模(当数很大时,相乘long long也会超出的解决办法)

Posted Roni

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速幂取模(当数很大时,相乘long long也会超出的解决办法)相关的知识,希望对你有一定的参考价值。

当几个数连续乘最后取模时,可以将每个数字先取模,最后再取模,即%对于*具有结合律。但是如果当用来取模的数本身就很大,采取上述方法就不行了。这个时候可以借鉴快速幂取模的方法,来达到大数相乘取模的效果。

LL mul(LL a,LL b)
{
    LL ans=0;
    while(b)
    {
        if(b&1) ans=(ans+a)%p;
        a=(a+a)%p;
        b=b>>1;
    }
    return ans;
}
LL Pow(LL a,LL b)
{
    LL result=1;
    LL base=a%p;
    while(b)
    {
        if(b&1) result=mul(result,base)%p;
        base=mul(base,base)%p;
        b=b>>1;
    }
    return result;
}

以上是关于快速幂取模(当数很大时,相乘long long也会超出的解决办法)的主要内容,如果未能解决你的问题,请参考以下文章

Java中有啥方法能使大于long 的两个数相乘???

快速幂取模和快乘取模

快速幂取模之引用详解

快速幂和快速幂取模

转C语言快速幂取模算法小结

快速乘