• 快速幂学习


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

  • 相关阅读:
    党务
    平台 大赛 公司
    音乐
    有趣的博主
    C++获取命令行参数命令
    360读全景
    3 海康网络相机官方例程(3)OpenCv + ffmpeg + rtmp 实现摄像头采集数据直播功能(不带cuda加速)
    使用opencv4进行分类器训练
    经典环境(2)OpenCV412+OpenCV-Contrib +vs2015+cuda10.1编译
    经典环境(1)OpenCV3.4.9+OpenCV-Contrib +vs2015+cuda10.1编译
  • 原文地址:https://www.cnblogs.com/TheSilverMoon/p/9378731.html
Copyright © 2020-2023  润新知