龜速乘
阿新 • • 發佈:2019-01-02
轉 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; } returnsum; }
相信你一眼就能看出來,這兩個東西長的不是一般的像。
如果再仔細觀察一下就會發現,快速冪裡的x是指數級增長,而龜速乘變成了翻倍,僅此而已。
龜速乘總結——快速冪的補充
實際上,龜速乘的確慢,甚至比直接用開始提到的迴圈乘法還要慢(因為龜速乘相當於一個自行取模的乘號),然而慢工出細活,正是它的慢最終為我們解決了資料過大時產生的問題。
歸根結底,龜速乘的出發點就是為了解決彌補快速冪的BUG,因而其思想與快速冪也十分接近。用一點點時間換來資料範圍的擴大,想來是個不虧的交易。
當然,平時不擔心爆long long的情況下,就沒必要把龜速乘加上了~