快速幂与快速幂取模

题目链接:https://ac.nowcoder.com/acm/contest/996/A

关于快速幂介绍:

  • 问题引入:我们在处理ab问题时,一般的做法就是连续乘上b次a,当b很大的时候,就会导致次数过多而超时的问题,而为了减少我们的计算次数,就研究出了快速幂算法。
  • 理解:比如当我们需要计算25时,一般做法即2*2*2*2*2,需要计算五次,而快速幂的思想就是21*24,就只需要计算2次就好了,至于为什么是1和4呢,这就涉及到对5进行二进制处理,52=101,我们发现,为1的数位,我们就需要乘上去,这里有几个1我们就要计算几次,而基数的自己相乘是每一步都在进行的,不管当前是不是1.

代码实现:

ll pow(ll a, ll b)
{
    ll ans = 1;
    while(b)
    {
        if(b & 1)   ans = ans * a;
        a = a * a;
        b >>= 1;
    }
    return ans;
}

快速幂取模,就是在快速幂的基础上,运用数学公式ab%p = (a % p)b % p % p,进而获知快速幂取模的算法

ll pow(ll a, ll b, ll p)
{
    ll ans = 1;
    while(b)
    {
        if(b & 1)   ans = ans * a % p;
        a = a * a % p;
        b >>= 1;
    }
    return ans;
}

  

原文地址:https://www.cnblogs.com/ACM-Epoch/p/13339004.html