本来是刷AC自动机的题目,不过看了n道题说都要用矩阵,所以就看看矩阵,刷刷矩阵入门题。随便写几篇接替报告。
这里就不介绍了,网上的大牛已经讲的很清楚了。
matrix67的博客:点击打开链接
酷行天下的博客:点击打开链接
下面给一点自己的理解
一、矩阵的快速幂
要想解决矩阵快速幂的问题,不妨来研究数的快速幂。
当K=25时:
相当于
所以将K按二进制展开,一共只需要计算K的二进制位长。
下面是代码:
int pow(int A,int K)
{
if(K ==0) return 1;
int t = 1;
while(K)
{
if(k&1) t = t*A;
K >>= 1;
A = A*A;
}
return t;;
}
同理,矩阵的快速幂也一样。
二、幂求和。求S = A + A2 + A3 +… + Ak
这里,用二分的思想。当k=6时,有:
A + A^2 + A^3 + A^4 + A^5 + A^6 =(A + A^2 + A^3) + A^3*(A + A^2 + A^3)
这样,可以先求出A^3,在求出A+A^2+A^3的值。
不失一般性,等于式子 A^k = A + A^1 + A^2 + ··· + A^k
如果k可以被二整除,那么A^K = A + A^1 + ··· +A^(k/2) + A^(k/2)(A + A^1 +··· + A^(k/2)),提取公因式得A^k = (A + A^1 +··· +A^(k/2)) (A^(k/2) + E) (其中E为单位矩阵);如果k不可以被二整除,那么将k减一继续。
可以很轻松的写出递归式:
//递归幂求和
//用二分法求矩阵和,递归实现
Matrix Power_Sum(Matrix a, int b) {
Matrix ret = a;
ret.init_e();
if (b == 1) {
return a;
} else if (b & 1) {
return (a ^ b) + Power_Sum1(a, b - 1);
} else {
return Power_Sum1(a, b >> 1) * ((a ^ (b >> 1)) + ret);
}
}
这样子,关于矩阵的运算就差不多了吧。
三、矩阵的在有向图中的应用
给定一个有向图G,用邻接矩阵表示,从A点到B点恰好走k步(允许重复经过同一条边)的方案数。观察一下矩阵乘法,C[i][j] += A[i][k] + B[k][j],相当于从A点经过k点到达B点的路径数。所以G^k就可以求出任意两点间经过k步的方案数。感觉有点像floyd算法。。。
就是求A^t1 + A^(t1+1) + ··· + A^t2。
四、矩阵的一些找规律的题目
这道题很难想到规律,囧。下面上图:
对要求和的式子变形处理
一般的幂求和会超时,将转移矩阵在加一维,就ok了。很难想到啊!!!!!