关于矩阵
矩阵
之前一直不太理解矩阵快速幂如何构造,实际上就是如果 \(i\) 能更新 \(j\) ,就把 \(a_{i,j}\) 加一即可。
tricks
积累一个刚刚学到的 \(trick\) 。
已知一个矩阵 \(A\) ,现在要求 \(A + A^2 + A^3 + ...... + A^k\) 。
如果直接求显然会大力 \(Tle\) 。。。
因此观察性质,不难发现这个式子满足等比数列的形式,由于矩阵乘法满足结合律,因此也满足以下式子 :
若 \(k\) 为奇数,原式 \(=(A + A^2 + ...... + A^{\frac{k}{2}}) + A^{\frac{k}{2}} * (A + A^2 + ...... + A^{\frac{k}{2}}) + A^k\)
若 \(k\) 为偶数,原式 \(=(A + A^2 + ...... + A^{\frac{k}{2}}) + A^{\frac{k}{2}} * (A + A^2 + ...... + A^{\frac{k}{2}})\)
不难发现,这样就可以在 \(O(n^3 \log k)\) 的优秀的时间复杂度内得到所求矩阵,具体实现如下 :
code
for(int i=20; ~i; --i){
if(!flag) { flag|=(k>>i)&1; continue; }
if((k>>i)&1) a=a+a*ul, ul=ul*ul*ans, a=a+ul;
else a=a+a*ul, ul=ul*ul;
}
考试中出现的一个 \(trick\) 。
若递推式中如果出现常数,可以将常数单独作为一维放入矩阵中,使常数向其它项转移,而其他项不向常数项转移。。。(貌似是废话。。。
对于矩阵快速幂,如果将运算中的乘法改成加法,加法改成去 \(max\),矩阵仍满足结合律,可以矩阵快速幂求解。
即:
\[A_{i,j}= max(B_{i,k}+C_{k,j})
\]
并不是很理解。。。
不过巨佬 \(Dky\) 说是对的。。。
话说我觉得矩阵本身就很玄学。。。
利用这种方法可以求解诸如最长路||最大值的问题。