蓝桥杯基础练习---矩阵乘法

Posted 我是codel

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝桥杯基础练习---矩阵乘法相关的知识,希望对你有一定的参考价值。

基础练习 矩阵乘法  
时间限制:1.0s   内存限制:512.0MB
   
锦囊1
 
锦囊2
 
锦囊3
 
问题描述
  给定一个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 20
hint:就是输入一个矩阵,让你求它的 n 次幂,一个数的快速幂知道了原理的话好像也不容易忘记了呢。。。矩阵的话,这个题目其实不需要快速幂可以做,但是快速幂的做法好像高大上一点? 做这个题目还是有收获有收获!!!
就是用向量的方式定义矩阵 typedef vector<vector<int> > mat  ;  可以用 mat a(n, vector<int>(m))的方式定义一个n * m的矩阵,然后矩阵乘法的话就是一个三重循环就好了
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<stdlib.h>
 4 #include<string.h>
 5 #include<vector>
 6 using namespace std;
 7 typedef vector<int> v;
 8 typedef vector<v>mat;
 9 int n, m;
10 
11 
12 //。。。以前做过的题目,现在又差不多忘光了吧。。。主要是忘记了vector的用法
13 //vector还是要好好学一学, vector<int> v 定义一个叫v的存储整型的向量,用vector定义二维数组(矩阵的方法) vector<v> mat;
14 //若要在定义一个向量矩阵的时候给它分配指定的空间大小的话,用 vector<vector<int> >mat(n, vector<int>(m)) 则行为n,列为m
15 
16 mat MAT(mat &a, mat &b){
17     mat c(a.size(), v(b[0].size()));
18     //c.resize(n);
19     for(int i=0; i<n; i++){
20         for(int j=0; j<n; j++){
21             c[i][j]=0;
22         }
23     }
24     for(int i=0; i<n; i++){
25         for(int j=0; j<n; j++){
26             for(int k=0; k<n; k++){
27                 c[i][j] += a[i][k] * b[k][j];
28             }
29         }
30     }
31     return c;
32 }
33 mat MATRIX(mat a, int b){
34     mat ans(n, v(n));
35     for(int i=0; i<n; i++){
36         ans[i][i] = 1;
37     }
38     while(b>0){
39         if(b&1) ans = MAT(ans, a);
40         a = MAT(a, a);
41         b >>= 1;
42     }
43     return ans;
44 }
45 int main(){
46     cin >> n >> m;
47     mat a(n, v(n));
48     mat ans(n, v(n));
49     for(int i = 0; i < n; i++){
50         for(int j = 0; j < n; j++){
51             int x;
52             cin >> x;
53             a[i][j] = x;
54         }
55     }
56     ans = MATRIX(a, m);
57     for(int i=0; i<n; i++){
58         for(int j=0; j<n; j++){
59             cout << ans[i][j] << " ";
60         }
61         cout << endl;
62     }
63     return 0;
64 }

 

以上是关于蓝桥杯基础练习---矩阵乘法的主要内容,如果未能解决你的问题,请参考以下文章

Java蓝桥杯基础练习

[蓝桥杯Python]算法练习算法基础算法训练算法模板(持续更新)

蓝桥网试题 java 基础练习 矩阵乘法

蓝桥杯 基础练习 BASIC-25 回形取数

蓝桥基础练习 矩阵乘法 BASIC-17(矩阵快速幂)

[蓝桥杯][基础练习VIP]回形取数