zoukankan      html  css  js  c++  java
  • 蓝桥杯 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;
    }
  • 相关阅读:
    对于工程师责任和责任边界的认知
    windows消息机制与实例
    final阶段团队贡献分分配
    Final阶段用户调查报告
    对金州勇士团队的项目进行功能分解(加分作业)
    final review 报告
    final发布评论
    本周PSP
    final发布视频
    【转】mac版微信web开发者工具(小程序开发工具)无法显示二维码 解决方案
  • 原文地址:https://www.cnblogs.com/yifan2016/p/5268349.html
Copyright © 2011-2022 走看看