正常来说求幂的方法就是把一个数连乘n次,那么这样的时间复杂度就是O(n),还是有点大的,现在学习到的这种快速幂的方法可以把复杂度降到O(logn),可以说是大大降低了。因为幂有可能会很大很大,爆int都是常态,所以要注意数据大小看是否开long long 或者一律long long。
而关于取模式子,在之前的博客中有提到过,学长说防溢出很有用,简单说就是随时取模(除法除外),传送门:https://www.cnblogs.com/TheSilverMoon/p/9316384.html
学习参考:http://www.cnblogs.com/CXCXCXC/p/4641812.html
核心代码
1 int quick_power(int a,int b) 2 { 3 int r=1,base=a; 4 while(b) 5 { 6 if(b%2) r*=base; 7 base*=base; 8 b/=2; 9 } 10 return r; 11 }
虽然这个代码很短,死背其实没啥问题,但是懂原理的话对于后面的矩阵快速幂等等都是很有好处的。
感觉自己的理解还不是很透彻,就不拿出来丢人了,以下是别人的解释,链接在上方
以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,这三项就可以完美解决了