特征多項式與常系數線性齊次遞推
一般來說,這個東西是用來優化能用矩陣乘法優化的遞推式子的。
通常,這種遞推式子的特征是在齊次的條件下,轉移系數也可以通過遞推得到。
對於這樣的遞推,通常解法為$O(NK)$的遞推或者$O(k^3\log n)$的矩陣乘法,但是有些**毒瘤**的出題人~~吉老師~~,會將這樣的遞推強行出成$K\le 1000$,特別,對於常系數線性齊次遞推有些出題人甚至會出成$20000$!
這樣,就需要引入一個非常有趣~~頭禿~~的概念:特征多項式。
首先,我們需要介紹$Cayley-Hamilton$定理
對於一個$n$階的一個方陣,它的特征多項式為$p(\lambda)=|\lambda E-A|=\lambda^n+b_1\lambda^{n-1}+b_2\lambda^{n-2}+...+b_n$
那么顯然:$p(A)=0$
也就是說:$A^N+b_1A^{n-1}+...+b_n=0$,即$p(\lambda)$為原多項式的化零多項式。
因此,這個特征多項式可以通過高斯消元及拉格朗日插值求出。
求矩陣的特征多項式
一個$O(n^4)$的做法
顯然,我們得到的特征多項式是一個$n$階多項式,那么只需要知道$n+1$個點的點值就可以得到了。
也就是,我們把$n+1$個數代入$|\lambda E-A|$中(作為$\lambda$),然后暴力高斯消元即可得到一個矩陣的特征多項式。
那么,接下來,只需要拉格朗日插值即可。
這個做法作為一個$n^4$的做法其實想要卡掉矩陣乘法是很難的,除非將遞推的項數放到$10^{1000}$這樣的級別,如[BZOJ4162]
那么接下來,我們考慮剛剛的做法能否被優化。
顯然,每次$n^3$求矩陣行列式太慢了。
一個$O(n^3)$的做法
對於這樣的矩陣:$A=P\times B\times P^{-1}$
稱$A,B$是相似的,也就是說,對於$A,B$的特征多項式相同。
構造還是很容易的,只需要保留每行與每行之間的關系即可。
對於這樣的矩陣,我們稱之為上海森堡矩陣。
$\begin{pmatrix} a_{1,1}&a_{1,2}&a_{1,3}&\cdots&a_{1,n}\\ a_{2,1}&a_{2,2}&a_{2,3}&\cdots&a_{2,n}\\ 0&a_{3,2}&a_{3,3}&\cdots&a_{3,n}\\ \vdots&\vdots&\vdots&\ddots&\vdots\\ 0&0&0&\cdots&a_{n,n} \end{pmatrix}$
那么,對於這樣的矩陣,求行列式的時間復雜度就降為$n^2$了!
然后,總時間復雜度為$n^3+n^2\log m$,或者為$n^3+n\log n \log m$(並無卵用),然后對於$n^3 \log m$的矩陣乘法構成了鮮明的優勢(大霧
顯然,其實上面的東西沒有那么有用...
但是還是有必要知道的,萬一他卡你呢?
常系數線性齊次遞推的矩陣的特征多項式
定義:遞推式為$f_i=\sum\limits_{j=1}^na_j\times f_{i-j},i>n$的遞推。
講道理,這個東西才非常有用...
對於所有的常系數線性齊次遞推來說,它們的矩陣形態類似,同樣,他們的特征多項式也類似...
其實手畫一下就可以發現,它們的特征多項式都是$p(\lambda)=\lambda^n-a_1\lambda^{n-1}-a_2\lambda^{n-2}-...-a_n$
按照行列式的定義展開式子退一下就得到啦!
特征多項式的使用手冊
其實,使用方法很簡單啦,就是運用之前得到的特征多項式性質,$p(A)=A^N+b_1A^{n-1}+...+b_n=0$
那么,對於這樣的式子,就可以做到將所有的$A^K$用$A^0\sim A^n$的矩陣線性表達出來了。
$A^{x+y}=A^x \times A^y$
那么$A^x=\sum\limits_{i=0}^n b_i\times A^i,A^y=\sum\limits_{i=0}^nc_i\times A^i$
也就是:$A^{x+y}=\sum\limits_{i=0}^n\sum\limits_{j=0}^nb_i\times c_{j}\times A^{i+j}$
因為有:$p(A)=0$也就是說:$A^{x+y}=\sum\limits_{k=0}^{2\times n}(\sum\limits_{i=0}^{\min(n,k)}b_ic_{k-i})A^k \mod p(\lambda)$
然后顯然,可以用倍增(其實就是快速冪)上述操作,也就是我們得到了一個$n^2\log m$復雜度的遞推。
對於上述暴力操作可以用$NTT$或$FFT$優化上述多項式相乘和多項式取模。
也就是說,我們得到了一個$n\log n \log m$的優秀做法!(拿頭寫啊
關於答案
$A^x=\sum\limits_{i=0}^n b_i\times A^i$
這個式子已經給我們答案了,也就是說,這個矩陣的前$n$項加上系數相加即可,但是顯然這個東西是$n^4$的
如果要求$f_m$的話,這個東西只需要用到$f_0\sim f_n$即可
如果求矩陣的話,還是老老實實的一個一個乘吧...
例題.jpg
求矩陣特征多項式裸題:[BZOJ4162]
常系數線性齊次遞推$n^2\log m$裸題:[BZOJ4161]
高難度的東西:[NOI 2017 泳池]
附件
NOI 2017 泳池 題解
對我來說,可能我只能接受$k\le 2000$,如果再大就想要打人了...
首先70分的暴力基本雷同[UNR 2 積勞成疾](http://uoj.ac/problem/311)
大概就是推一個$f[i][j],s[i][j]$即可,[我不想再寫一遍了](https://winniechen.cn/?p=152)
剩下的就是可以把這個轉移寫成矩陣的形式,然后就可以拿到優秀的$90$分了。
最后,根據上面的東西,優化一下就可以AC掉這道題了!