对于出现线性递推的题目,当直接暴力计算的复杂度太高时,我们可以考虑用矩阵快速幂进行加速。
因为虽然矩阵乘法的复杂度为O(n^3),但是通过二进制分解,整体的复杂度变成了 log(n^3) = 3logn = O(logn),复杂度是对数级别的,非常小。
但是矩阵快速幂的难点就是在如何构造矩阵来完成计算。
因为矩阵快速幂是用来加速线性递推的,所以最核心的部分就是线性递推公式。
最经典的就是斐波那契数列的递推: f(n) = f(n-1) + f(n-2);
其对应的矩阵就是 f(n+1) 1 1 f(n)
f(n) = 0 1 * f(n-1)
可以发现,左面是个常数矩阵,而右面的列向量中每一项就是递推公式中的依赖项。
当递推公式中出现常数时,我们只需在右面的列向量中加入个常数1,即可。
剩下的就是我们如何去构造左面的常数矩阵。其实给出了右面的列向量,我们在根据题中的递推公式,在左面的常数矩阵中填入对应的常数即可。
这样,这个问题就圆满的解答了。