• 矩阵快速幂


    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;
    }

  • 相关阅读:
    利用WebClient实现自动添写、提交表单
    动态.net代码生成器遇到的问题
    unicode
    使用using清理非托管资源
    C#中解决插入数据库的某个字段类型为datetime 为空
    JQuery中根据属性或属性值获得元素
    Access 的top和order by 的问题
    JavaScript escape() 函数
    Asp.net嵌套
    合并程序集时出错的问题ILMerge.Merge.ERROR...
  • 原文地址:https://www.cnblogs.com/yzxverygood/p/8410450.html
Copyright © 2020-2023  润新知