見洛谷模板題。
有個數列\(\),給出前\(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)\)
我們要求\(a^n\vec v\)中的第\(k\)項。
先介紹一些奇奇怪怪的東西(以下的東西不帶嚴謹證明)
對於乙個矩陣\(a\),如果能找到乙個數\(\lambda\)和乙個列向量\(\overline v\),滿足\(\lambda\vec v=a\vec v\),那麼分別稱它們是一組特徵值和特徵向量。
移項得\((\lambda e-a)\vec v=0\)
這個方程滿足當且僅當\(\det(\lambda e -a)=0\)(不會證)
\[\lambda e-a= \left(
\lambda-a_1 & -a_2 & \cdots &-a_ & -a_m \\
-1 & \lambda & \cdots & 0 &0 \\
0 & -1 &\cdots & 0 & 0\\
\vdots & \vdots & \ddots & \vdots &\vdots \\
0 & 0 & \cdots & -1 & \lambda
\end
}\right)\]
用點基本的數學知識可以算出\(\det(\lambda e-a)=\lambda^k-\sum_^a_\lambda^i\)
我們可以將其看作乙個關於\(\lambda\)的多項式(叫特徵多項式),記作\(g(\lambda)\)。
cayley-hamilton定理:\(g(a)=o\)(\(o\)表示全\(0\)的矩陣)
(感性理解:\(ae-a=0\),所以這個東西成立。當然這樣證明顯然是不對的)
將\(a\)替代\(\lambda\),可以看做乙個矩陣的多項式。並且顯然每一項底數為\(a\)的兩個多項式相乘符合交換律。
考慮除法,形如\(a^n=p(a)g(a)+q(a)\)
由於\(g(a)=o\),所以\(a^n=q(a)\)
現在我們就真把它當多項式來算。我們計算\(q(x)\equiv x^n \pmod \)
用倍增+多項式取模算出\(q(x)\)的每一項的係數。
現在我們要求\((a^n\vec v)_m\),即\(\sum_^q_i(a^i\vec v)_m=\sum_^q_ia_i\)
於是做完了。總時間複雜度\(o(k\lg k \lg n)\)。
using namespace std;
#include #include #include #define n 65536
#define mo 998244353
#define ll long long
ll qpow(ll x,ll y=mo-2)
int n,k;
int a[n],f[n];
int nn,re[n];
void setlen(int n) }}
int main()
常係數齊次線性遞推
給定遞推式 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 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 的時間複雜...
線性常係數齊次遞推總結
本文為作者的一些理解,如有錯誤之處請指出。其實就是這樣乙個式子 a n alpha 1a alpha 2a alpha 3a alpha ka 因為它是線性的,沒有高次的項,而且次數都相等,沒有一些不是常數的奇怪函式夾在裡面 所以它叫這個名字 還有它的特徵方程是 x k alpha 1x alpha...