矩阵乘幂优化k阶常系数线性递推(数论-矩阵)

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的使用。

建议各种矩阵运算写进结构体。

建议先判一下特殊情况。

猜你喜欢

转载自blog.csdn.net/wwwengine/article/details/81024189