矩阵快速幂

PART1 矩阵乘法

矩阵相乘最重要的方法是一般矩阵乘积。它只有在第一个矩阵的列数(column)和第二个矩阵的行数(row)相同时才有意义 。一般单指矩阵乘积时,指的便是一般矩阵乘积。一个m×n的矩阵就是m×n个数排成m行n列的一个数阵。由于它把许多数据紧凑的集中到了一起,所以有时候可以简便地表示一些复杂的模型。

e.g.

PART 2 快速幂

快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。

PART3 矩阵快速幂

顾名思义,矩阵快速幂就是以快速幂的思想进行矩阵乘法(洛谷p3390),代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
struct node{
      long long g[1001][1001];
}res;
int n;
node operator * (node a,node b){
      node c;
      long long x;
      for(int i=1;i<=n;i++)
         for(int j=1;j<=n;j++){
             x=0;
             for(int k=1;k<=n;k++)
                x+=(a.g[i][k]*b.g[k][j])%1000000007;
             c.g[i][j]=(x)%1000000007;
         }
      return c;
}
void go(node a,long long k){
      res=a;
      while(k){
          if(k&1){
              res=res*a;
          }
          a=a*a;
          k>>=1;
      }
}
int main()
{     int m,i,j;
      long long k;
      node a;
      cin>>n>>k;
      for(i=1;i<=n;i++)
         for(j=1;j<=n;j++){
             scanf("%lld",&a.g[i][j]);
         }
      go(a,k-1);
      for(i=1;i<=n;i++){
         for(j=1;j<=n;j++){
             printf("%lld ",res.g[i][j]);
         }
         puts("");
      }
      return 0;
}

posted @ 2018-02-03 18:57  水题收割者  阅读(143)  评论(0编辑  收藏  举报