常係數齊次線性遞推快速演算法學習筆記

2022-05-11 03:49:14 字數 2653 閱讀 1920

今天集訓被線代狠狠的虐了一發。

不過還有一點收穫的,比如這個。

數列 \(f\) 滿足 \(f_n=\sum\limits_^ka_if_(n\ge k)\),其中 \(a_1\dots a_k,f_0\dots f_\) 均給出。求 \(f_n\)。

\(n\le 10^9,k\le 30000\)。

先要弄懂一些基本定義,

矩陣,行列式,高斯消元這些基本的東西就自己看別的東西去吧,我也不知道有什麼好的資料,不妨去洛谷搜模板看題解,那裡面的都不錯。

然後講一下特徵值,特徵多項式和 hamilton-cayley 定理,就能做這題了。

對於 \(n\times n\) 的矩陣 \(a\),如果存在數 \(\lambda\) 和非零列向量 \(x\) 滿足 \(ax=\lambda x\),那麼 \(\lambda\) 是 \(a\) 的特徵值,\(x\) 是 \(a\) 的特徵向量。

那麼 \(ax=\lambda i x\)。\((\lambda i-a)x=0\)。因為 \(x\) 不為零向量,所以 \(\det(\lambda i-a)=0\),也就是 \(\lambda i-a\) 不滿秩。

我們稱 \(\det(\lambda i-a)=0\) 為 \(a\) 的特徵多項式,元是 \(\lambda\)。特徵多項式是 \(n\) 次的,他的 \(n\) 個根就是 \(a\) 的所有特徵值。(可能有相等的根)

對於上三角矩陣,所有的特徵值就是主對角線上的所有值。

如果有 \(n\) 個線性無關的特徵向量 \(x_i\)(當且僅當 \(a\) 滿秩),那麼有 \(a\beginx_1&x_2&\cdots&x_n\end=\beginx_1&x_2&\cdots&x_n\end\begin\lambda_1&0&0&\cdots&0\\0&\lambda_2&0&\cdots&0\\\cdots\\0&0&0&\cdots&\lambda_n\end\)。

hamilton-cayley 定理:對於矩陣 \(a\) 的特徵多項式 \(f(\lambda)=\sum\limits_^nc_i\lambda^i\),有 \(f(a)=0\),即 \(\sum\limits_^nc_ia^i=0\)。

會了這些,就可以開始了。

\(o(k^3\log n)\) 的相信大家都會。(什麼?不會?趕快去學矩陣快速冪)

首先考慮寫出轉移矩陣 \(a\) 和初始行向量 \(f\),我們要求的是 \(f\times a^n\) 的第 \(0\) 維。

假如我們構造出了乙個序列 \(c\) 使得

\[a^n=\sum\limits_^c_ia^i

\]那麼有:

\[f\times a^n=\sum\limits_^c_i(f\times a^i)

\]\[(f\times a^n)_0=\sum\limits_^c_i(f\times a^i)_0

\]\[f_n=\sum\limits_^c_if_i

\]那麼就可以 \(o(k)\) 計算了。

那麼 \(c\) 怎麼弄呢?

令 \(r(a)=\sum\limits_^c_ia^i\)

假如存在 \(k\) 次多項式 \(g(a)\),使得 \(a^n=f(a)g(a)+r(a)\)。(標準多項式除法形式)

當 \(g(a)=0\) 時就有 \(a^n=r(a)\),所以要求的就是 \(a^n\bmod g(a)\),快速冪+多項式除法 \(o(k\log k\log n)\) 解決。

那麼如何構造 \(g(a)=0\) 的多項式呢?

看到上面的 hamilton-cayley 定理,令 \(g(\lambda)=\det(\lambda i-a)\) 即可。

手玩一下,發現 \(\det(\lambda i-a)=-\sum\limits_^\lambda^ia_+\lambda^k\)。(注意交換行的時候取相反數!!!)

所以 \(g_i=-a_(i\ne k),g_k=1\)。

時間複雜度 \(o(k\log k\log n)\)。

#includeusing namespace std;

typedef long long ll;

const int maxn=333333,mod=998244353;

#define for(i,a,b) for(int i=(a);i<=(b);i++)

#define rof(i,a,b) for(int i=(a);i>=(b);i--)

#define mem(x,v) memset(x,v,sizeof(x))

inline int read()

int n,k,s,f[maxn],g[maxn],fac[maxn],ans[maxn],prod[maxn],tmp[maxn],lim,l,rev[maxn],invt[maxn],arev[maxn],btmp[maxn],brev[maxn],brevinv[maxn],c[maxn];

inline int add(int x,int y)

void init(int upr)

void ntt(int *a,int tp)

void division(int *a,int *b,int *d,int n,int m)

for(i,0,k-1) s=add(s,mul(f[i],ans[i]));

printf("%d\n",s);

}

常係數齊次線性遞推

給定遞推式 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 階常係數齊次線性遞推數列的前 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 使得 a...