學習筆記 常係數齊次線性遞推

2022-08-09 00:54:12 字數 2599 閱讀 6507

給定乙個 \(k\) 階常係數齊次線性遞推數列的前 \(k\) 項 \(h_1, h_2, h_3..h_k\) 和線性遞推式 \(h_n = \sum_ ^ k a_i h_\), 求這個數列的第 \(n\) 項。

複雜度要求: \(o(k^2logn)\)

加強: \(o(klogklogn)\)

設 \(a\) 是 \(n\) 階方陣,如果存在數 \(\lambda\) 和非零 \(n\) 維列向量 \(x\),使得 \(ax=\lambda x\) 成立,則稱 \(\lambda\) 是矩陣 \(a\) 的乙個特徵值。

設 \(e\) 為單位矩陣,\(n\) 階方陣 \(a\) 的特徵多項式為 \(|\lambda e - a|\)

解釋一下:\(\lambda\) 為乙個變數。 \(\lambda e - a\) 的行列式是乙個關於 \(\lambda\) 的 \(n\) 次多項式,即 \(a\) 的特徵多項式。

特徵值是 \(|\lambda e - a| = 0\) 的根。

設 \(a\) 的特徵多項式為 \(p_a\),\(o\) 為零矩陣。用矩陣 \(a\) 代替 \(\lambda\) 帶入 特徵多項式,有 \(p_a(a) = o\)

簡要證明一下:把 \(a\) 直接帶進特徵多項式, \(p_a(a) = |ae - a| = 0\)

其實我並不會證這個東西。自學的線代等於沒學

現在我們已經熟背了cayley-hamilton定理。

考慮計算一下矩陣快速冪的轉移矩陣 \(m\) 的特徵多項式。

設 \(m_\) 為去掉位置 \((x,y)\) 的代數余子式,\(m_\) 為 \((x,y)\) 位置上的元素,直接對第 \(1\) 行拉普拉斯展開,\(m = \sum_^k m_ m_\) ,可以發現去掉第一行第 \(i\) 列之後留下的是乙個下三角矩陣,\(m_ = (-1) ^ (-1)^\lambda^\),\(m_ =\lambda-a_1,m_ = -a_i\),整理一下就得到:

\[|e\lambda - m| = \lambda ^ k - a_1 \lambda ^ - a_2 \lambda ^ - ... - a_n

\]由 cayley-hamilton定理,我們得到 \(p_m(m) = o\)

現在我們用 \(n\) 代替 \(n - k\),我們要求出 \(m^n\)

\(m^n= p_m(m) a(m) + r(m)\),其中\(r(m)\) 的次數不高於\(k - 1\)

因為 \(p_m(m) = o\), 得到 \(m^n = r(m)\)

我們現在只需要求 \(m^n \mod p_m(m)\)

因為 \(ab \mod c = (a \mod c)(b \mod c) \mod c\),所以可以快速冪計算 \(m^n \mod p_m(m)\)

直接暴力複雜度 \(o(k^2logn)\), 用多項式乘法和取模可以做到 \(o(klogklogn)\)

現在得到了 \(m^n = r(m) = \sum_ ^ c_i m ^ i\)

再分析一下就可以得到 \(ans = \sum_ ^ c_i h_\)

再暴力或者 ntt 處理一下前 \(h\) 的前 \(2k\) 項就好了。

需要注意,當 \(k = 1\) 時,\(m^1\) 需要對 \(p_m(m)\) 取模。

bzoj4161: shlw loves matrixi

這道題裡面 \(h\) 的下標是從 \(0\) 開始的。

#pragma gcc optimize("2,ofast,inline")

#include#define fi first

#define se second

#define mp make_pair

#define pb push_back

#define ll long long

#define pii pairusing namespace std;

const int mod = 1e9 + 7;

template t read(t &x)

inline void upd(int &x, int y)

inline int add(int x, int y)

inline int dec(int x, int y)

namespace linear

} }void mul(int *x, int *y, int *z)

} module(res);

for (int i = 0; i < k; ++i) z[i] = res[i];

} void poly_pow(int p)

}

int solve()

} int ans = 0;

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

upd(ans, 1ll * c[i] * h[i + k] % mod);

return ans; }}

using namespace linear;

int main()

for (int i = 1; i <= k; ++i)

cout << solve() << endl;

return 0;

}

常係數齊次線性遞推

給定遞推式 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 的時間複雜...