今天集訓被線代狠狠的虐了一發。
不過還有一點收穫的,比如這個。
數列 \(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...