从一个朴素的问题出发:我们需要求出一个序列b[],使得符合递推式 f(n)=∑i=1..kcif(n−i) f ( n ) = ∑ i = 1.. k c i f ( n − i ) ,且前K项为给出的常数,记为A[]。就比如斐波那契数列,fib[1]=1,fib[2]=1, f(n)=f(n−1)+f(n−2) f ( n ) = f ( n − 1 ) + f ( n − 2 ) 。
update 5.24
真·常系数齐次线性递推是这样子的…
你考虑矩阵乘法优化的做法,就是先搞出一个转移矩阵T,然后把读入的数列前i项做成一个向量v,那么答案就是 vTn−k v T n − k 的最后一位嘛,为了方便,下面n-k写成n。
一个结论是,这个转移矩阵的特征多项式,和上面那个递推式长得差不多,即为 f(x)=xk−∑i=1..kcixk−i f ( x ) = x k − ∑ i = 1.. k c i x k − i ,这个可以把矩阵画出来看看。
根据特征多项式的性质,我们知道f(T)=0,那么 Tn=Tn−H(T)∗f(T) T n = T n − H ( T ) ∗ f ( T ) ,其中H(T)为任意多项式。那么我们就可以得到 Tn