《算法笔记》二分—快速幂
问题:给定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;
}