利用二進位制的方式來進行實現
\(2^0 = 2^0\)
\(2^1 = 2^1\)
\(2^2 = 2^2\)
\(2^3 = 2^2 * 2\)
\(2^4 = 2^4\)
\(2^5 = 2^4 * 2\)
\(2^6 = 2^4 * 2^2\)
\(2^7 = 2^4 * 2^2 * 2\)
所以我們可以看出來的是
二進位制位上我們現在只有當某一位是1的時候才乘
舉個例子
\[2^ =2^ = 2^ * 2^ * 2^ = 2^8 * 2^4 * 2^2 * 2^1
\]\[2^ = 2 ^ = 2^ * 2^ = 2^8 * 2^2
\]所以原來\(o(b)\)複雜度一下降低到了\(o(logb)\)
sample code
inline int pow(int a,int b)
return r;//返回結果
}
定義矩陣乘法的運算方式是:
\[c _ = \quad\sum _ ^na _ *b _
\]舉個例子
\[\begin
& & \\
& &
\end
\begin
\\\\
\end =
\begin
+ + \\
+ +
\end
\]\[\therefore
\begin
1 & 2 & 3 \\
4 & 5 & 6
\end
\begin
7 \\
8 \\
9\end =
\begin
1 * 7 + 2 * 8 + 3 * 9 \\
4 * 7 + 5 * 8 + 6 * 9
\end
\]\[\therefore
\begin
1 & 2 & 3 \\
4 & 5 & 6
\end
\begin
7 \\
8 \\
9\end =
\begin
50 \\
122\end
\]sample code
int n;//矩陣大小
void up(int &x, int y) //簡單定義 +=
struct matrix
};
在計算遞推式的時候,我們可以把遞推式構建成矩陣乘法的樣子
比如形如下列遞推式的遞推式:
\[f(n) = a * f(n - 1) + b * f(n - 2)
\]我們可以考慮構造成:
\[\begin
a & b \\
1 & 0
\end
\begin
f(n - 1) \\
f(n - 2)
\end =
\begin
f(n) \\
f(n - 1)
\end\]
然後就有:
\[\begin
a & b \\
1 & 0
\end
\begin
f(n - 1) \\
f(n - 2)
\end =
\begin
f(n) \\
f(n - 1)
\end
\]\[\because
\begin
a & b \\
1 & 0
\end
\begin
f(n - 2) \\
f(n - 3)
\end =
\begin
f(n - 1) \\
f(n - 2)
\end
\]\[\therefore
\begin
a & b \\
1 & 0
\end^2
\begin
f(n - 2) \\
f(n - 3)
\end =
\begin
f(n) \\
f(n - 1)
\end\]
\[\begin
a & b \\
1 & 0
\end^3
\begin
f(n - 3) \\
f(n - 4)
\end =
\begin
f(n) \\
f(n - 1)
\end\]
\[\begin
a & b \\
1 & 0
\end^
\begin
f(1) \\
f(0)
\end =
\begin
f(n) \\
f(n - 1)
\end\]
然後構造起來的道理是這樣,但是真正的矩陣是什麼樣子的還得自己知道怎麼推然後再去做
假如給你乙個形如\(f(n) = a * f(n - 1) + b * f(n - 2) + c * f(n - 3)\)你要是不會推還是會gg
的
然後因為有的時候\(dp\)的遞推式也可以用矩陣來加速,所以用處很大
前一部分的模板
sample code
void up(int &x, int y) //簡單定義+=
struct matrix
};matrix qpow(matrix x, int timer)//矩陣快速冪
矩陣快速冪詳解
在講矩陣快速冪之前,先引入整數快速冪的概念。整數快速冪 為了引出矩陣快速冪,以及說明快速冪演算法的好處,我們可以先求整數的冪。如果現在要算x 8 則x x x x x x x x x按照尋常思路,乙個乙個往上邊乘,則乘法運算進行7次。用 x x x x x x x x 這種求法,先進行乘法得x 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 ...