矩陣快速冪

2022-04-16 03:16:11 字數 1316 閱讀 9549

矩陣的快速冪是用來高效地計算矩陣的高次方的。將樸素的o(n)的時間複雜度,降到log(n)。

其演算法本身,利用了之前運算的結果,讓整個的運算過程呈現出一種二叉樹從底層向上進行收攏的效果。

具體來說,當我們要計算a8的時候,我們樸素的演算法是依次計算a*a*a*a*a*a*a*a,即第一步先算出a2然後算式變為a2*a*a*a*a*a*a*a,再變為a3*a*a*a*a*a,依次類推,最終得出a8的值。

而矩陣快速冪的演算法則是,先算出a2再利用其結果進行下一步運算,即a*a*a*a*a*a*a*a會先變成a2*a2*a2*a2,之後在計算出a4,將算式變為a4*a4,之後算出a8,這樣整個過程只進行了log(8)次,大大減少了運算過程。

這樣的運算過程就像剛剛所說,是一種類似於二叉樹從底層向上收攏的感覺。實際實現過程借助了計算機中 數的二進位制表示。使用位運算則可以很好地得出結果。

51nod中的1242(戳我)即矩陣快速冪的模板題,大家可以用來練習

斐波那契數列的定義如下:

f(0) = 0

f(1) = 1

f(n) = f(n - 1) + f(n - 2) (n >= 2)

(1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, ...)

給出n,求f(n),由於結果很大,輸出f(n) % 1000000009的結果即可。

input

輸入1個數n(1 <= n <= 10^18)。
output

輸出f(n) % 1000000009的結果。
input示例

11
output示例

89

ac**:

#include #include 

#include

using

namespace

std;

const

long

long inf=1000000009

;struct

nodet;

node mult(node a,node b);

for(int i=0;i<2;i++)

for(int j=0;j<2;j++)

for(int k=0;k<2;k++)

return

c;

}node pow(

long

long

n) t=mult(t,t);

n=n>>1

;

}return

pt;}

intmain()

快速冪(矩陣快速冪)

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

快速冪 矩陣快速冪

快速冪 我們求a ba b ab最直接的方法就是把a乘b次這樣的話複雜度就是o n o n o n 但是在比賽時面對1e9的資料時還是會輕鬆超時的,此時就需要一種更快的乘法來幫助我們 我們把b拆成二進位制的形式得到a ba b ab a 10.01 a a1 0.01此時對b分解得到的序列10.01...