基础练习 矩阵乘法
时间限制: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 }
时间: 2024-10-11 04:22:42