• 快速幂&&龟速乘&&快速乘


    背景

      今天有一道题死活过不去,然后看大佬的博客,发现需要用到龟速乘。

      然鹅我并不知道什么是龟速乘,于是就去查了QAQ

      然后还被安利了快速乘。


      做题的时候经常需要求解形如 ab mod c 的式子。

      当b的值比较小的时候,我们可以使用 循环乘【基本挂掉 或者 快速幂。

    快速幂

      我知道大家都会,所以放个代码滚了

      

       算法时间复杂度 O(log n)。

    龟速乘

      快速幂多么优秀的复杂度啊。

      然鹅总是会有很多很多的毒瘤出题人,会造诸如一下这组数据的一大堆数据点。

    19260817 2333333 1234567654321

    快速幂爆了QAQ【当模数>1e9的时候,在相乘的时候爆long long了

    ????手写高精度????

    不,我们选择龟速乘。

     

    比起计算机自带的乘法,龟速乘的的运行速度要慢上一些。

    但是,它可以保证快速幂不会boom的一声炸掉,然后送给你一个神奇的数字。

     

    把龟速乘和快速幂放在一起看,可以发现,造成快速幂爆掉,而龟速乘没事的原因就是

      快速幂里的x是指数级增长,而龟速乘变成了翻倍

    快速乘

      被旁边的大佬安利了快速乘,于是去学了。

    人们在研发出上面龟速乘以后,再也不用为了次方运算+取模的题型烦恼了……

    然而,总是有人不满足:

     那就是复杂度为O(1)的,一行可以打完的,快速乘的诞生。

    从大佬的博客里面看到了这个

      这是2009国家集训队论文:

        骆可强:《论程序底层优化的一些方法与技巧》

     

    顺便%%%%%%%%%%%%%%一发

    其实上面那一坨术语意思就是:

      long double 存下会爆 long long 的值,完成运算之后,再把不会爆 long long 的值塞回去。

     

    不过再好的算法都会有漏洞,快速乘的缺点就在于,可能会产生由于long long和long double互相转换而产生的精度损失。

    总结

      每个算法都有利有弊,还是根据情况选择使用吧QAQ

  • 相关阅读:
    几个带双下划线的宏
    WM_COPYDATA消息机制 不同进程间发送结构体数据
    解锁ubuntu系统的root
    申请堆空间函数封装(两种方法)
    UITableView的分页的加载
    UIView设置成圆角
    iPhone开发:类似iChat的聊天泡泡
    iPhone中如何自定义tabbar
    android 底部选项卡(TabHost)
    Android 多个Activity选项卡实现
  • 原文地址:https://www.cnblogs.com/qxyzili--24/p/11235649.html
Copyright © 2020-2023  润新知