1. 程式人生 > >龜速乘

龜速乘

轉 https://blog.csdn.net/Cyan_rose/article/details/83065026

 龜速乘的根據&實現——慢工出細活

比起計算機自帶的乘法,龜速乘的的執行速度還要慢上一些。

但是,它可以有效地保證你的long long不會boom的一聲炸掉,然後送給你一個神奇的數字。

long long quick_mul(long long x,long long y,long long mod) 
{
    long long ans=0;
    while(y!=0){
        if(y&1==1)ans+=x,ans%=mod;
        x
=x+x,x%=mod; y>>=1; } return ans; } long long quick_pow(long long x,long long y,long long mod) { long long sum=1; while(y!=0){ if(y&1==1)sum=quick_mul(sum,x,mod),sum%=mod; x=quick_mul(x,x,mod),x%=mod; y=y>>1; } return
sum; }

相信你一眼就能看出來,這兩個東西長的不是一般的像。

如果再仔細觀察一下就會發現,快速冪裡的x是指數級增長,而龜速乘變成了翻倍,僅此而已。

 

龜速乘總結——快速冪的補充

實際上,龜速乘的確慢,甚至比直接用開始提到的迴圈乘法還要慢(因為龜速乘相當於一個自行取模的乘號),然而慢工出細活,正是它的慢最終為我們解決了資料過大時產生的問題。

歸根結底,龜速乘的出發點就是為了解決彌補快速冪的BUG,因而其思想與快速冪也十分接近。用一點點時間換來資料範圍的擴大,想來是個不虧的交易。

當然,平時不擔心爆long long的情況下,就沒必要把龜速乘加上了~