对于快速幂,比较好理解;
就简单介绍一下a^b,如果单纯的用for循环需要b次
但是用快速幂就只需眼看b的二进制数;
代码如下:
int poww(int a, int b) {
int ans = 1, base = a;
while (b != 0) {
if (b & 1 != 0)
ans *= base;
base *= base;
b >>= 1;
}
return ans;
}
代码很短,死记也可行,但最好还是理解一下吧,其实也很好理解,
以b==11为例,b=>1011,二进制从右向左算,
但乘出来的顺序是 a^(2^0)*a^(2^1)*a^(2^3),
是从左向右的。我们不断的让base*=base目的即是累乘,以便随时对ans做出贡献。
其中要理解base*=base这一步:
因为 base*base==base2,
下一步再乘,就是base2*base2==base4,
然后同理 base4*base4=base8,
由此可以做到base-->base2-->base4-->base8-->base16-->base32.......指数正是 2^i ,
再看上面的例子,a¹¹= a1*a2*a8,这三项就可以完美解决了,快速幂就是这样。
顺便啰嗦一句,由于指数函数是爆炸增长的函数,所以很有可能会爆掉int的范围,根据题意选择 long long还是mod某个数自己看着办。