矩陣 快速冪及應用

2021-08-19 13:22:42 字數 1157 閱讀 7112

一、快速冪部分

求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 ...