0%

快速幂

简单记录快速幂原理

以a^11为例:

11的二进制数为1011,二进制从右向左算,但乘出来的顺序是 a^(2^0)*a^(2^1)*a^(2^3),是从左向右的。我们不断的让base *= base目的是累乘,以便随时对ans做出贡献。

要理解base *= base这一步:因为base * base == base ^ 2,下一步再乘,就是(base ^ 2) * (base ^ 2) == base ^ 4,然后同理(base ^ 4) * (base ^ 4) == base ^ 8,由此可以做到base base ^ 2 base ^ 4 base ^ 8 base ^ 16 base ^ 32…….指数正好是 2 ^ i 。再看上面的例子,a= (a ^ 1) * (a ^ 2) * (a ^ 8),这三项就可以完美解决了,快速幂就是这样。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include<bits/stdc++.h>
using namespace std;

long long x,y,ans;//Bottom_Number,Time,Answer

long long qp(long long a,long long b)//Quick Power
{
long long ans=1,cnt=a;
while(b)//Cacluate Answer
{
if(b&1)//b is an odd number
{
ans*=cnt;
}
cnt*=cnt;
b>>=1;//AS b=b/2
}
return ans;
}

int qp2(long long a,long long b){
long long r=1,base=a;
while(b!=0){
if(b%2) r*=base;
base*=base;
b/=2;
}
return r;
}

int main()
{
cin>>x>>y;
ans=qp(x,y);
cout<<ans;
return 0;
}

本文参考@LL_Leung