1. 程式人生 > >藍橋杯基礎練習---矩陣乘法

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

cst ans 時間限制 str 絕對值 忘記 個數 clu 表示

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

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