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

背景

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

  然鹅我并不知道什么是龟速乘,于是就去查了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

原文地址:https://www.cnblogs.com/qxyzili--24/p/11235649.html