常系数齐次线性递推
题目描述
数列 { a n } \{a_n\} { an}满足 k k k阶线性递推关系: a n = ∑ i = 1 k f i a n − i ( n ≥ k ) a_n=\sum_{i=1}^kf_ia_{n-i} (n\ge k) an=∑i=1kfian−i(n≥k)。
现给定 n , k n,k n,k以及 f 1 , f 2 , . . . , f k , a 0 , a 1 , . . . , a k − 1 f_1,f_2,...,f_k,a_0,a_1,...,a_{k-1} f1,f2,...,fk,a0,a1,...,ak−1,求 a n m o d 998244353 a_n \mod 998244353 anmod998244353的值。
数据范围
n ≤ 1 0 9 , k ≤ 32000 n\le 10^9, k\le 32000 n≤109,k≤32000
思路
令 F = [ 0 1 . . . 0 0 0 ⋱ 0 0 0 . . . 1 f k f k − 1 . . . f 1 ] F=\begin{bmatrix}0&1&...&0\\0&0&⋱&0\\0&0&...&1\\f_{k}&f_{k-1}&...&f_1\end{bmatrix} F=⎣⎢⎢⎡000fk100fk−1...⋱......001f1⎦⎥⎥⎤。
则 [ a n a n + 1 . . . a n + k − 1 ] = F n [ a 0 a 1 . . . a k − 1 ] \begin{bmatrix}a_n\\a_{n+1}\\...\\a_{n+k-1}\end{bmatrix}=F^n\begin{bmatrix}a_0\\a_1\\...\\a_{k-1}\end{bmatrix} ⎣⎢⎢⎡anan+1...an+k−1⎦⎥⎥⎤=Fn⎣⎢⎢⎡a0a1...ak−1⎦⎥⎥⎤。
F F F的特征多项式为 g ( λ ) = ∣ λ I − F ∣ = λ k − ∑ i = 1 k f i λ k − i g(\lambda)=|\lambda I-F|=\lambda^k-\sum_{i=1}^kf_i\lambda^{k-i} g(λ)=∣λI−F∣=λk−∑i=1kfiλk−i。
根据代数基本定理,可以把 g ( λ ) g(\lambda) g(λ)表示为 g ( λ ) = ∏ i = 1 t ( λ − λ i ) m i g(\lambda)=\prod_{i=1}^t(\lambda-\lambda_i)^{m_i} g(λ)=∏i=1t(λ−λi)mi,其中 λ i \lambda_i λi各不相同,且 ∑ i = 1 t m i = k \sum_{i=1}^t m_i=k ∑i=1tmi=k。
因此 a n = ∑ i = 1 t λ i n ( ∑ j = 1 m i c i j n j − 1 ) a_n=\sum_{i=1}^t\lambda_i^n(\sum_{j=1}^{m_i}c_{ij}n^{j-1}) an=∑i=1tλin(∑j=1micijnj−1),其中 c i j c_{ij} cij可以通过待定系数法确定。
但是 λ i \lambda_i λi咋解? c i j c_{ij} cij咋求?好像有点麻烦。
这时,还需要用到Hamilton-Cayley定理—— g ( F ) = F k − ∑ i = 1 k f i F k − i = O g(F)=F^k-\sum_{i=1}^kf_iF^{k-i}=O g(F)=Fk−∑i=1kfiFk−i=O。
若 r ( λ ) = λ n m o d g ( λ ) = ∑ i = 0 k − 1 r i λ i r(\lambda)=\lambda^n\mod g(\lambda)=\sum_{i=0}^{k-1}r_i\lambda^i r(λ)=λnmodg(λ)=∑i=0k−1riλi,
则 [ a n a n + 1 . . . a n + k − 1 ] = r ( F ) [ a 0 a 1 . . . a k − 1 ] \begin{bmatrix}a_n\\a_{n+1}\\...\\a_{n+k-1}\end{bmatrix}=r(F)\begin{bmatrix}a_0\\a_1\\...\\a_{k-1}\end{bmatrix} ⎣⎢⎢⎡anan+1...an+k−1⎦⎥⎥⎤=r(F)⎣⎢⎢⎡a0a1...ak−1⎦⎥⎥⎤,
则 a n = ∑ i = 0 k − 1 r i a i a_n=\sum_{i=0}^{k-1}r_ia_i an=∑i=0k−1riai。
总结一下:
- 求出递推关系的特征多项式 g ( λ ) = λ k − ∑ i = 1 k f i λ k − i g(\lambda)=\lambda^k-\sum_{i=1}^kf_i\lambda^{k-i} g(λ)=λk−∑i=1kfiλk−i。
- 求出 r ( λ ) = λ n m o d g ( λ ) = ∑ i = 0 k − 1 r i λ i r(\lambda)=\lambda^n\mod g(\lambda)=\sum_{i=0}^{k-1}r_i\lambda^i r(λ)=λnmodg(λ)=∑i=0k−1riλi。这一步需要多项式快速幂+取模。
- 求出 a n = ∑ i = 0 k − 1 r i a i a_n=\sum_{i=0}^{k-1}r_ia_i an=∑i=0k−1riai。