快速幂学习

正常来说求幂的方法就是把一个数连乘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,这三项就可以完美解决了

posted @ 2018-07-27 17:19  TheSilverMoon  阅读(303)  评论(0编辑  收藏  举报