• 矩阵快速幂模板


    首先是二分快速幂的写法:

     1 long long doexp(int x,int y)
     2 {
     3     long long i=1,j=x;
     4     long long k;
     5     if (x==1||y==1) return x;
     6     while (y)
     7     {
     8         if (y&1) i=(i*j)%k;
     9         j=(j*j)%k;
    10         y=y>>1;
    11     }
    12     return i;
    13 }

    利用了二分log(n)级的快速迭代平方运算,可以很高效地完成幂运算。

    与数的乘幂相类似,矩阵乘法同样存在结合律,所以可以利用相同的方法加速运算,得到矩阵快速幂。

     1 //首先定义一下矩阵类型
     2 typedef struct matrixnod
     3 {
     4     int m[3][3];
     5 } matrix;
     6 
     7 //3*3的矩阵乘法
     8 matrix mat(matrix a,matrix b)
     9 {
    10     matrix c;
    11     int mod;
    12     for (int i=0;i<3;i++)
    13     for (int j=0;j<3;j++)
    14     {
    15         c.m[i][j]=0;
    16         for (int k=0;k<3;k++) c.m[i][j]+=(a.m[i][k]*b.m[k][j])%mod;
    17         c.m[i][j]%=mod;
    18     }
    19     return c;
    20 }
    21 
    22 //矩阵快速幂 b^n
    23 matrix doexpmat(matrix b,int n)
    24 {
    25     matrix a= //单位矩阵
    26     {
    27         1,0,0,
    28         0,1,0,
    29         0,0,1
    30     };
    31     while(n)
    32     {
    33         if (n&1) a=mat(a,b);
    34         n=n>>1;
    35         b=mat(b,b);
    36     }
    37     return a;
    38 }


    形式上来说跟普通的二分快速幂相同

    对于这一类题目,解题的核心就在于如何给出一个可行的矩阵来将初始状态推到最终需要的结果上。

    这里可以采用DP等思路来把(状态转移)矩阵给推出来,话说DP优化里面本来也就有一项是矩阵优化......殊途同归啊

  • 相关阅读:
    LeetCode#191 Number of 1 Bits
    敏捷编程
    过程模型
    磁盘阵列
    RAM和ROM
    cache
    局部性原理
    栈的应用(一)——括号的匹配
    猫狗收养问题
    全局变量和局部变量
  • 原文地址:https://www.cnblogs.com/jcf94/p/4281667.html
Copyright © 2020-2023  润新知