矩阵相关

本来是刷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算法。。。

         Hdu 2254 奥运

         就是求A^t1 + A^(t1+1) + ··· + A^t2。


       四、矩阵的一些找规律的题目

       Hdu 2256 Problem of Precision

       这道题很难想到规律,囧。下面上图:

       


        Hdu 1588 Gauss Fibonacci

          对要求和的式子变形处理

    Fzu 1683 纪念SlingShot

          一般的幂求和会超时,将转移矩阵在加一维,就ok了。很难想到啊!!!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值