k阶常系数线性递推关系的一般形式:
f(n)=a1*f(n-1)+a2*f(n-2)+......+ak*f(n-k) ;
其中,a1,a2,.....ak是常数,共有k项。但当n极其庞大,一般的dp显得效率低下,这样的问题可以用矩阵优化!
以斐波那契数列为例,f(n)=f(n-1)+f(n-2),即a1=1,a2=1;
我们用两个矩阵F(i),A来表示:
令F(n-1)= f(n-1), A = 1 1
f(n-2), 1 0
那么F(n-1)*A= F(n)= f(n)
f(n-1)
由上,可以得到:F(n)=F(n-1)*A=F(n-2)*A^2=.......=F(2)*A^(n-2);
f(n)就是F(n)的(1,1)项。
于是问题转化为快速求矩阵A^(n-2),而这可以用矩阵快速幂解决。当n极其大时,效率大大提高!!!
通常,当递推式有k项时:
初始F= f(1) 相伴矩阵 A = a1,a2,a3,.....ak (共k行k列)
f(2) 1, 0 ,0..........0
f(3) 0, 1 ,0..........0
............ ...............................
f(n-k) 0, 0 ,.........1, 0
有的题伴随矩阵是有变化的,但往往形成循环,故用一维即可,具体需要就题推导。
注意:
矩阵快速幂建议用二进制,不用分治。
注意系数a1,a2,....ak一定需要是常数或者有变化规律且规律普遍的数,否则不能用矩阵优化。
注意long long的使用。
建议各种矩阵运算写进结构体。
建议先判一下特殊情况。