• 蓝桥杯 BASIC_17 矩阵乘法 (矩阵快速幂)


    问题描述
      给定一个N阶矩阵A,输出A的M次幂(M是非负整数)
      例如:
      A =
      1 2
      3 4
      A的2次幂
      7 10
      15 22
    输入格式
      第一行是一个正整数N、M(1<=N<=30, 0<=M<=5),表示矩阵A的阶数和要求的幂数
      接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值
    输出格式
      输出共N行,每行N个整数,表示A的M次幂所对应的矩阵。相邻的数之间用一个空格隔开
    样例输入
    2 2
    1 2
    3 4
    样例输出
    7 10
    15 22
     
     
    这道题题目很简单,而且数据量也很小,直接暴力算的话,应该也是可以的,但是,我还是打算用它的标准解法,矩阵快速冥来优化它的时间复杂度
    #include<iostream>
    #include<string.h>
    using namespace std;
    struct M{
        int num[40][40];
        M(){
            memset(num,0,sizeof(num));
        }
    };
    M a,e;
    int m;
    M mul(M a,M b){//计算矩阵乘法
        M c;
        for(int i=0;i<m;i++){
            for(int j=0;j<m;j++){
                for(int k=0;k<m;k++){
                    c.num[i][j]+=(a.num[i][k]*b.num[k][j]);
                }
            }
        }
        return c;
    }
    M multi(M c,int n){//矩阵快速冥核心代码
        M b=c,r=e;
        while(n){
            if(n&1){
                r=mul(r,b);
            }
            b=mul(b,b);
            n>>=1;
        }
        return r;
    }
    int main(){
        int n;
        cin>>m>>n;
        for(int i=0;i<m;i++){
            e.num[i][i]=1;
            for(int j=0;j<m;j++){
                cin>>a.num[i][j];
            }
        }
        M x = multi(a,n);
        for(int i=0;i<m;i++){
            for(int j=0;j<m;j++){
                cout<<x.num[i][j]<<" ";
            }
            cout<<endl;
        }
        return 0;
    }
  • 相关阅读:
    安装node和npm
    安装git
    常用软件
    vscode常用插件
    git生成ssh key
    04.接口初始化规则与类加载器准备阶段和初始化阶段的意义
    03.编译期常量与运行期常量的区别与数组创建本质分析
    02.常量的本质含义与反编译及助记符
    01.类加载,连接与初始化过程
    HTTP 状态码大全
  • 原文地址:https://www.cnblogs.com/yifan2016/p/5268349.html
Copyright © 2020-2023  润新知