一、快速冪部分
求a^b,**如下。
#include using namespace std;
int quickpow(int x, int y)
return ans;
}int main()
其中 「>>」位移運算,就是把y轉換為
二進位制數
,整體向右移一位,高位補零,最低位消失,通常右移一位就等價於y除以2再賦給b。 "&"可判斷y的二進位制數最後一位是否為1,等價於判斷奇偶。
這裡舉例說明綠色部分**。
eg:求a^11
11的二進位制數是1011=2^0+2^1+2^3;
其中要理解x*=x這一步,x*x==x^2,下一步再乘,就是x^2*x^2==x^4,然後同理 x^4 * x^4 = x^8 ...在迴圈中x-->x^2-->x^4-->x^8-->x^16-->x^32.......指數正是 2^i 啊,再看上面的例子,a^11= a^(2^0) * a^(2^1) * a^(2^3),這三項就完美解決了。
二、矩陣&快速冪部分
繼續上**
struct matrix //結構體,矩陣
;matrix mul(matrix a, matrix b, int n) //兩個n階矩陣的乘積
matrix quickpow(matrix k, int n, int n) //n階矩陣的n次冪
return k;
}
三、應用
poj 3070 題目,求斐波那契數列。
直接遞推的侷限性:
(1)本題讓你遞推的斐波那契數n高達10億。測試時間僅1秒的時間,for迴圈用遞推公式遞迴導致超時。
(2)通過打表實現隨機訪問根本不可能,先把斐波那契數列求到10億,然後想去進行隨機訪問。題目未給出那麼多記憶體,陣列也開不到10億。
因此它可以用矩陣快速冪來寫。
觀察f[n] = f[n-1]+f[n-2] 第n相是由第n-1項和第n-2項遞推而來。
同理,第n+1項由第n項和第n-1項遞推而來。
因此可以用矩陣表示:
(字有點醜。。。)
三 矩陣快速冪應用
這個同學寫的太好了,於是我又厚顏無恥的借鑑了 例一 poj 3070 題目 斐波那契數列f n 給乙個n,求f n 10000,n 1e9 這題是可以用fibo的迴圈節去做的,不過這裡不講,反正是水題 矩陣快速冪是用來求解遞推式的,所以第一步先要列出遞推式 f n f n 1 f n 2 第二步是建...
快速冪(矩陣快速冪)
求 3 0 3 1 3 n mod 1000000007 input 輸入乙個數n 0 n 10 9 output 輸出 計算結果 sample input 3sample output 40 分析 利用等比數列的求和公式得所求和是 3 n 1 1 2,如果暴力求3 n 1 會超時,這裡引入快速冪來...
快速冪 矩陣快速冪
快速冪 正常情況下求乙個數的冪時間複雜度為o n 而快速冪能把時間複雜度降到o logn 舉個例子 求5的13次方 思想首先把13化為二進位制 1101,即13 1101 8 1 4 1 2 0 1 1 即5 13 58 1 54 1 52 0 5 1 15 5 8 1 5 4 1 5 2 0 5 ...