矩陣的快速冪是用來高效地計算矩陣的高次方的。將樸素的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示例
11output示例
89ac**:
#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...