zoukankan      html  css  js  c++  java
  • 快速幂学习

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

  • 相关阅读:
    Python-内存管理
    Python如何操作Excel
    336. 文本压缩
    Python-锁
    MVC接收以post形式传输的各种参数
    linux批量替换指定文件夹中所有文件的指定内容
    ES6:string.raw浅析
    node学习笔记
    运行node提示:events.js:160 throw er; // Unhandled 'error' event
    socket.io入门示例参考
  • 原文地址:https://www.cnblogs.com/TheSilverMoon/p/9378731.html
Copyright © 2011-2022 走看看