快速幂 顾名思义 就是快速求幂的方法 再通俗的讲就是求 a^b 的快速方法
通常情况我们求a^b 就是求b个a相称 时间复杂度为O(n) 看起来已经很快了 只需遍历一遍就能求出结果 但是 这依旧不能满足我们的需求 我们希望有更快的方法来求得 a^b 结果 所以就有了快速幂
首先它的 时间复杂度是O(log₂N)
方法是 将b转化为二进制的形式进行求解 a^b
以 b=11 为例 即 a^11
11的二进制是1011
11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
因此,我们将a¹¹转化为
这样原先需要11次运算方法就转换成了3次运算
代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <queue>
#include <map>
#define pi acos(-1.0)
#define inf 0x3f3f3f3f
#define linf 0x3f3f3f3f3f3f3f3fLL
#define ms(a,b) memset(a,b,sizeof(a))
#define ll long long
#define maxn 110
#define inf 0x3f3f3f3f
#define mod 100007
using namespace std;
ll Power(ll x,ll y)
{
ll ret=1;
ll base=x%mod;
while(y)
{
if(y%2)// 将b逐位转化为二进制 并判断该为是0还是1 0则不需要乘进去
ret=((ret%mod)*(base%mod))%mod;
base=((base%mod)*(base%mod))%mod;// 求x的几次方
y/=2;// 相当于将y的二进制右移一位
}
return ret%mod;
}
int main ()
{
int a,b;
scanf ("%d%d",&a,&b);
printf ("%lld\n",Power(a,b));
return 0;
}
将a^b 中的b转化为二进制形式后 求解的过程其实就是判断在b的每个二进制位上判断 a2^n
是否需要乘进最终结果1 0 1 1
a8 a4 a2 a1
当b的二进制位位0是 不需要乘
所以代码中的 a=a*a 的作用就是求a的几次方
另外 大数运算时 类型可以改为 long long 并在求a 和 tamp 时进行取模