一般矩阵快速幂的形式 :
f ( n ) = ∑ i = 1 k 1 a i f ( n − i ) + ∑ i = 1 k 2 b i g ( n − i ) + c f(n)=\sum_{i=1}^{k_1} a_if(n-i)+\sum_{i=1}^{k_2}b_ig(n-i)+c f(n)=i=1∑k1aif(n−i)+i=1∑k2big(n−i)+c
可以做到 k 3 log n k^3 \log n k3logn的递推,在某些特殊转移下,有更加快速的方法。
若有如下转移
f ( n ) = ∑ i = 1 k a i f ( n − i ) f(n)=\sum_{i=1}^k a_if(n-i) f(n)=i=1∑kaif(n−i)
这就是常系数线性递推的基本形式。一般可以做到 k log k log n k\log k \log n klogklogn,比较简单的写法也可以做到 k 2 log n k^2 \log n k2logn,下面介绍如何优化。
##特征多项式
前置技能:矩阵的秩
特征值,特征向量:
若有常数 λ \lambda λ,向量 v ⃗ \vec v v,满足 λ v ⃗ = A v ⃗ \lambda\vec v=A\vec v λv=Av,则称向量 v ⃗ \vec v v为矩阵 A A A的一组特征向量,$\lambda 为 矩 阵 为矩阵 为矩阵A$的一组特征值。
秩为k的矩阵有k组线性不相关的特征向量。
特征多项式
对关系式进行变换: ( λ I − A ) v ⃗ = 0 (\lambda I-A)\vec v=0 (λI−A)v=0。
这个等式有非零解的充要条件是 d e t ( λ I − A ) = 0 det(\lambda I-A)=0 det(λI−A)=0,即为矩阵不满秩。
可以得到一个 k k k次多项式,这个多项式的值等于0时把这个方程称为矩阵 A A A的特征方程。这个多项式称为矩阵 A A A的特征多项式。
k个解自然就是 k k k个特征值辣(并不需要解出来,怎么处理后面会说)!
跟据算数基本定理,最终的多项式有k个解,可以写作 f ( x ) = Π i ( λ i − x ) f(x)=\Pi_i(\lambda_i-x) f(x)=Πi(λi−x),而且带入 A A A矩阵本身会得到 0 0 0矩阵(Cayley-Hamilton 定理)。
证明:
(下面的证明是博主以前学OI的时候写的一种比较复杂的证明,其实可以直接用伴随矩阵来证明)
f ( A ) = Π i ( λ i I − A ) f(A)=\Pi_i(\lambda_i I -A) f(A)=Πi(λiI−A)
考虑将 f ( A ) f(A) f(A)得到的矩阵分别乘特征向量,如果最后都得到了0矩阵,因为这几个特征向量线性不相关,那么可证明 f ( A ) f(A) f(A)乘以任意向量都会得到 0 0 0矩阵,从而 A A A为 0 0 0矩阵。
现在问题转化为证明 f ( A ) f(A) f(A)乘任意特征向量值得到 0 0 0矩阵。首先证明 ( λ i I − A ) ( λ j I − A ) = ( λ j I − A ) ( λ i I − A ) (\lambda_i I-A)(\lambda_j I - A)=(\lambda_j I - A)(\lambda_i I-A) (λiI−A)(λjI−A)=(λjI−A)(λiI−