概要:
在一些递推式中,我们发现好像不能在优化了(例如斐波那契数列普通递推是O(n)的),但是这个特殊的递推式我们可以用矩阵来实现O(logn)(忽略了矩阵自身计算的O(n^3))。而矩阵乘法运算是a[i, k]*b[k, j]=c[i, j],从这个式子可看出朴素是n^3的(当然那些神算法我不会),而fib数列递推式可以用矩阵乘法来表示,即
$$ \lgroup \begin{matrix} f(n-1) & f(n-2) \end{matrix} \rgroup \left \lgroup \begin{matrix} 1 & 1 \\ 1 & 0 \end{matrix} \right \rgroup = \lgroup \begin{matrix} f(n) & f(n-1) \end{matrix} \rgroup $$
而矩阵乘法是可以做快速幂的!也就是说矩阵A[i,j]^n可以像快速幂一样计算!这样logn就出来了。
技巧及注意:
注意一定不要搞错位置!因为矩阵乘法中A*B和B*A的概念完全不同,所以在调用自己写的矩阵幂时一定不要搞错顺序!
在一些递推式中我们要好好想想有没有能用一个矩阵来描述我们的递推式的,然后就可以写了。(显然让你求一个数列的n次幂,而n<=10^18啥的数据,显然是矩阵)
在一些没一行都是根据上一行的某种规律转移的,我们可以考虑缩小它的矩阵表示,使得复杂度进一步减小,例如
- 【POJ】3150 Cellular Automaton(矩阵乘法+特殊的技巧)中,就是运用了原矩阵中每行都是由前一行向右移一位得到的这个性质,然后将n*n的矩阵缩到n,这样只需要计算一行的就能推出其它行的,那么复杂度降到了n^2。
例题: