快速冪(取模)演算法
阿新 • • 發佈:2018-12-09
對於普通型別的求a^n,我們的求法是不是a*a*a*a....,這樣乘以n次,時間複雜度為O(n),對於普通n比較小的我們可以接受,然而當n比較大的時候,計算就慢了,所以我們就去尋找更快捷的計算方法!
例如:我們要求2^8,我們通過當為偶數的時候,a^n=(a*a)^(n/2),當n為奇數時,a^n=a*(a*a)^(n/2)的形式,是不是可以轉化為4^4->8^2->64^1,就可以了,2^5的話2*4^2->2*16^1。(把冪化為底數,減少乘法的次數)
int power(int a, int n)//a^n { int ans = 1; while(n > 0) { if(n&1) //當n為奇數時,乘以餘下的一個a ans *= a; a *= a; n /= 2; } return ans; }
但是當n比較大時往往我們的結果都非常大,如果直接算的話就會溢位,所以我們在計算的過程中會對結果取模,然後我們就有了快速冪取模演算法。控制資料的大小,對於取模我們有(a*b)%c = ((a%c)*(b%c))%c,給出程式碼。
int power(long long a, int n) { long long ans = 1; while(n > 0) { if(n&1) { ans *= a; ans %= mod; } a *= a%mod; a %= mod; n /= 2; } return ans%mod; }