先說矩陣a的n次冪(an)的快速冪的求法
因為矩陣乘滿足結合律,所以矩陣的快速冪和前面普通快速冪原理都一樣,主要在於矩陣乘法的運算
1.1 直接模擬矩陣乘(m行)
用結構體存矩陣(乙個結構體可以直接賦值另乙個結構體)
struct mat
;mat init=mat
;
mat mul
(mat a,mat b)
所以a,b兩個矩陣相乘就可以呼叫函式mul===>mul(a,b)
1.2 過載*號,
c++的運算子過載
mat operator *
(const mat &x,
const mat &y)
//過載運算子
或者:
struct mat
return ans;}}
;
現在a,b兩個矩陣就可以直接相乘了===>a*b
以 fibonacci 數列為例:
數列中 f0 = 0,f1 = 1, fn = fn−1 + fn−2 ,它有兩個單項式,我們就可以構造乙個2行2列的矩陣,利用矩陣的乘法求fn,我們先寫出它的下一項
然後現在來填構造矩陣,因為fn = 1* fn−1 +1* fn−2 ,所以第一列都是1
因為fn-1 = 1* fn−1 +0* fn−2 ,所以第二列分別是1,0
然後我們用矩陣算f3
f3 = f2 + f1
f4 = f3 + f2 ∣f2
f100
∣\begin f~2~ & f~1~ \\ 0&0 \\ \end
∣∣∣∣f
20f
10∣
∣∣∣
∣ 11
10∣\begin 1 &1 \\ 1&0 \\ \end
∣∣∣∣1
110
∣∣∣
∣=∣ f3
f200
∣\begin f~3~ & f~2~ \\ 0&0 \\ \end
∣∣∣∣f
30f
20∣
∣∣∣
即:∣110
0∣\begin 1 &1 \\ 0&0 \\ \end
∣∣∣∣1
010
∣∣∣
∣∣ 11
10∣\begin 1 &1 \\ 1&0 \\ \end
∣∣∣∣1
110
∣∣∣
∣=∣ f3
f200
∣\begin f~3~ & f~2~ \\ 0&0 \\ \end
∣∣∣∣f
30f
20∣
∣∣∣
所以fn就等於矩陣∣f2
f100
∣\begin f~2~ & f~1~ \\ 0&0 \\ \end
∣∣∣∣f
20f
10∣
∣∣∣
乘以矩陣∣11
10∣\begin 1 &1 \\ 1&0 \\ \end
∣∣∣∣1
110
∣∣∣
∣的n-2次冪
**:poj 3070
#include
#include
#include
using namespace std;
typedef
long
long ll;
const
int mod =
1e4;
struct mat
;mat init=mat
;mat init1=mat
;//單位矩陣
mat operator *
(const mat &x,
const mat &y)
//過載運算子
常係數齊次線性遞推
給定遞推式 f n a 1f a 2 f a k f 給定 f 0,f 1.f k 求 f n 先定義 f n 的特徵方程 c x x a 1 x a 2 x a x a k 由基本代數定理,c x 0 的解 稱為特徵根 有 k 個,設為 alpha 1 alpha 2.alpha k 有 f n ...
常係數齊次線性遞推
見洛谷模板題。有個數列 給出前 k 項,即 a 0,a 1,dots,a 對於後面的所有 a n 有 a n sum f ia f 給出。小學生 直接幹。初中生 矩陣乘法。現在設 a 為轉移矩陣。列向量 vec v a a dots,a 0 滿足 a vec v a a dots,a 1 我們要求 ...
模板 常係數齊次線性遞推
題目傳送門 給出 k,a f 存在 forall n k wedge n in mathbb,exists a n sum f ka 給出 n 求出 a n n le 10 9,k le 32000 以下部分借鑑了 bjpers2 的題解 恭喜您!您獲得了 theta k 3 log n 的時間複雜...