給定乙個 \(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 的時間複雜...