已知底數a,指數b,取模值mod。
求ans = a^b % mod
二、樸素演算法(已知可跳過)
ans = 1,迴圈從 i 到 b ,每次將 ans = ans * a % mo
時間複雜度o(b)
void
power
(int a,
int b,
int mod)
}
時間複雜度o(log2b)
最近看團隊老師推薦的《演算法競賽(從入門到高階)——羅勇軍 郭衛斌著》一書,對快速冪演算法有新的理解,之前分奇偶情況感覺理解不是很透徹。
以 211 為例,211 可分為 28 、 22 、21三項相乘,為什麼指數11是分成8、2、1呢?熟悉二進位制的人應該對這三個數很熟悉,分別的23, 21, 20。
恰是如此,在指數的分解上,我們可以把指數化為二進位制。
(11)10 =(1011)2 = ( 23 + (0*22)+21 + 20 )10= 8 + 2 + 1
根據紅色標紅式可知,只有當二進位制數字為1時,分解式中對應的項才是有效的(0乘任何數都為0)。
b&1:判斷二進位制最右邊數字是否為1
b>>1:二進位制數向右移一位
二者結合,判斷二進位制每次更新的最右位數字是否為1。
在快速冪演算法中,a更新儲存的是指數b從右往左的每一項(不管指數b最右是不是1,都在一直更新,例如20,21,22,23……),只有當b更新後的最右位是1,ans才會乘上a儲存的項(可結合上面211的例子理解)
int
qmod
(int a,
int b,
int mod)
return ans;
}
1. 杭電oj 1061 rightmost digit.
2. 杭電oj 1097 a hard puzzle.
二進位制快速冪及矩陣快速冪
二進位制快速冪 二進位制快速冪雖然不難寫,但是無奈總是會忘,所以還是在這裡把板子寫一下。二進位制快速冪很好理解 假設我們要求a b,那麼其實b是可以拆成二進位制的,該二進位制數第i位的權為2 i 1 例如當b 11時,11的二進位制是1011,11 2 1 2 0 2 1 2 1,因此,我們將a 轉...
快速冪運算詳解,二進位制運算
昨天剛剛學了快速冪運算來加快冪運算,即ax,來總結一下 我們最常用的冪運算是,使用乙個迴圈語句來控制迴圈乘或者直接使用庫函式pow int a,int n 來實現冪運算。使用迴圈語句來進行冪運算,時間複雜度是o n 再進行網上查詢了解到pow庫函式的時間複雜度會比o n 還大 了解鏈結為 所以我們使...
二進位制 二進位制起源
現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...