藍橋杯基礎練習---矩陣乘法


基礎練習 矩陣乘法  
時間限制: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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM