最近寫到快速冪的演算法題,就比如313,按照之前的做法無非不是寫個迴圈模擬計算,對於指數較小的情況的確可以完成,倘若指數過於大,程式會超時,此時就需要運用到快速冪的方法:
正常情況下的計算時間複雜程度為o(n),a^n=a * a * a…* a(n個a)
但a和n過於大時我們可以換種思路,我們知道a^n * a^m = a^(m+n),
而我們所用的快速冪的方法就是按指數的二進位制來劃分新的任務。
用313作為例子,13 = (1101)2,我們同時也不難發現
313 = 3(1101)因為n有|log22 = 38 * 34 * 31
n|+1個二進位制位,由上面不難看出我們只需要計算o(logn)次就可以計算出結果,所以其時間複雜程度頁大大降低。
同時觀察上面例子我們也不難發現,結果都是2k相乘
31 = 3
32 = (31)2
34 = (32)2
38 = (34)2
而從上面我們也可以看出除了第乙個,後面任意乙個元素都是其前乙個元素的平方,同時在例子中參與相乘的元素都是二進位為1的整係數冪。
於是我們可以寫出**:
int
quickpow
(int x ,
int y)
//傳入底數和指數
res = res * res;
y = y >>1;
//右位移操作
}return ans;
}
當然很多時候冪運算結果過於大所以題目有時會採取取模操作,這時的大數快速冪道理也是一樣,可由上面的結論進行轉換。
有數學定理這樣定義:(a^b)%c = ((a%c)^b)%c
由次我們可以寫出**:
int
quickpow
(int a,
int b,
int c)
//傳入底數,指數和模
b = b >>1;
res =
(res * res)
%c;//同樣取模防止溢位
}return ans;
}
以上便是我對快速冪的理解,如果有什麼錯誤請大家指出,共同進步!!! 快速冪 大數取模
首先要知道取餘的公式 a b p a p b p p。那麼冪不就是乘機的累積嗎,由此給出 int fast int a,int b,int p return int t p 順便把大數取模也給出吧,它的原理就是這個取餘公式 a b p a p b p p 那麼大數可以看做每一位的那位數字乘以自身的權...
快速冪 快速冪取模
快速冪的思想在於快速求解高冪指數的冪運算 複雜度為o log2n 與樸素運算相比有很大的改進 接下來給出 其中有詳解 include include using namespace std typedef long long ll ll pow1 int a,int b 最常規的方法 將冪指數轉化為...
快速冪 快速冪取模
求x m 一般方法是 xm x xm 1,這樣需要做m次乘法,未免過慢。加速方法有兩種。1.基於當m為偶數時,xm x2 m 2 當m為奇數時,xm x xm 1。顯然當m為偶數時m會減半,當m為奇數時,下次就是偶數。m可以很快收斂到0.表示冪 2.將m看成二進位制串mkmk 1 m1m0,那麼xm...