• 蓝桥杯 矩阵乘法 模板


    矩阵乘法

    for(int i=0;i<n;++i){
        for(int j=0;j<n;++j){
            for(int k=0;k<n;++k){
                c[i][j]+=a[i][k]*b[k][j];
            }
        }
    }
    

    例题

    基础练习 矩阵乘法  
    时间限制:1.0s   内存限制:512.0MB
       
    问题描述
      给定一个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<cstring>
    using namespace std;
    const int N = 33;
    int a[N][N],b[N][N],c[N][N];
    int main()
    {
        int n,m;
        cin>>n>>m;
        for(int i=0;i<n;++i){
            for(int j=0;j<n;++j){
                cin>>a[i][j];
                c[i][j]=b[i][j]=a[i][j];
            }
        }
        if(m==0){
            for(int i=0;i<n;++i){
                for(int j=0;j<n;++j){
                    if(i==j)c[i][j]=1;
                    else c[i][j]=0;
                }
            }
        }
        else{
            m--;
            while(m--){
                memcpy(b,c,sizeof c);
                for(int i=0;i<n;++i){
                    for(int j=0;j<n;++j){
                        c[i][j]=0;
                        for(int k=0;k<n;++k){
                            c[i][j]+=a[i][k]*b[k][j];
                        }
                    }
                }
            }
        }
        for(int i=0;i<n;++i){
            for(int j=0;j<n;++j){
                cout<<c[i][j]<<" ";
            }
            cout<<endl;
        }
        return 0;
    }
    

    快速幂做法

    #include<iostream>
    #include<vector>
    using namespace std;
    typedef vector<vector<int>> matrix;
    const int N = 35;
    int n,m;
    matrix mul(matrix m1,matrix m2)
    {
        matrix res(N,vector<int>(N));
        for(int i=0;i<n;++i){
            for(int j=0;j<n;++j){
                for(int k=0;k<n;++k){
                    res[i][j]+=m1[i][k]*m2[k][j];
                }
            }
        }
        return res;
    }
    int main()
    {
        cin>>n>>m;
        matrix m1(N,vector<int>(N));
        for(int i=0;i<n;++i){
            for(int j=0;j<n;++j){
                cin>>m1[i][j];
            }
        }
        matrix res(N,vector<int>(N));
        for(int i=0;i<n;++i){
            for(int j=0;j<n;++j){
                if(i==j)res[i][j]=1;
                else res[i][j]=0;
            }
        }
        while(m){
            if(m&1)res=mul(res,m1);
            m>>=1;
            m1=mul(m1,m1);
        }
        for(int i=0;i<n;++i){
            for(int j=0;j<n;++j){
                cout<<res[i][j]<<" ";
            }
            cout<<endl;
        }
        return 0;
    }
    
  • 相关阅读:
    互联网公司笔试常见陷阱
    华为机试题(地铁换乘,图的应用)
    容器(vector)、数组、new创建的动态数组,你到底用哪一个(执行效率分析)
    SpringMVC全局异常
    github commit contributions无记录
    elasticSearch之查询
    nginx负载均衡策略
    docker入门
    解决centos&win安装安装elasticSearch无法运行
    2017年终总结
  • 原文地址:https://www.cnblogs.com/clear-love/p/11294775.html
Copyright © 2020-2023  润新知