快速幂

快速幂之所以快的原因是它以logN的速度减少了运算次数

问题

给定a, b, m三个正整数,求 ab % m

实战中要注意的细节:
1.如果初始a的值大于等于m, 那么进入函数前要将a对m取模
2.如果m是1的话可以在外部加个判断, 因为任何数对m取模都是0嘛

迭代写法
typedef long long LL;
LL binaryPow2( LL a, LL b, LL m )
{
    LL base = a;
    LL ans = 1;
    while(b>0)
    {
        if(b&1)
            ans = ans * base % m;
        base = base*base % m;
        b >>= 1;
    }
    return ans;
}
递归写法
  • 如果b是奇数, 那么有 ab = a * ab-1
  • 如果b是偶数, 那么有 ab = ab/2 * ab/2
  • 递归终点为 a0 = 1
typedef long long LL;
LL binaryPow( LL a, LL b, LL m )
{
    if( b==0 )
        return 1;
    if( b&1 )
        return a%m * binaryPow(a,b-1,m) % m;
    else
    {
        LL ans = binaryPow(a,b/2,m);
        return ans * ans % m;
    }
}

你可能感兴趣的:(快速幂)