《算法笔记》二分—快速幂

问题:给定a(a<109)、b(b<106)、m(1<m<109),计算ab%m,时间复杂度为O(b)

使用快速幂思想计算

一、递归写法,时间复杂度O(logb)

终止条件为:a0=1
递归公式为:
若b为奇数,ab=aa(b-1)
若b为偶数,ab=a(b/2)
a(b/2)

#include<algorithm>
using namespace std;

typedef long long LL;

LL binaryPow(LL a,LL b,LL m)
{
    if(b==0) return 1;
    if(b^1)//用与运算判断b为奇数,速度快一点
    {
        return a*binaryPow(a,b-1,m)%m;
    }
    else
    {
        LL mul;
        mul=binaryPow(a,b/2,m);
        return mul*mul%m;
    }
}
int main()
{
    
    return 0;
}

如果a>m,在进入递归前,就应该先让a模m
如果m为1,就不用进入递归函数

迭代写法

将b写为二进制,b为多项二次幂之和,ab可以写为a(2i)...a8a4a2**a,如果当前二进制位为1,a(2i)项就被选中
每一项都等于后一项的平方

#include<stdio.h>
#include<algorithm>
using namespace std;

typedef long long LL;
LL binaryPow(LL a,LL b,LL m)
{
    int ans=1;
    while(b>0)
    {
        if(b&1)
        {
            ans=ans*a%m;
        }
        a=a*a%m;
        b>>=1;
    }
    return ans;
}
posted @ 2021-02-04 22:29  inss!w!  阅读(56)  评论(0编辑  收藏  举报