给出两个矩阵A和B。
A的长是N1,宽是M1;B的 长是N2,宽是M2。
如果M1等于N2时,可以进行矩阵乘积,最后的结果是N1 X M2的矩阵。
#include <cstdio>
using namespace std;
int main() {
int a11, a12, a13;
int a21, a22, a23;
int b11, b12;
int b21, b22;
int b31, b32;
scanf("%d %d %d", &a11, &a12, &a13);
scanf("%d %d %d", &a21, &a22, &a23);
scanf("%d %d", &b11, &b12);
scanf("%d %d", &b21, &b22);
scanf("%d %d", &b31, &b32);
printf("%d %d \n", a11 * b11 + a12 * b21 + a13 * b31,
a11 * b12 + a12 * b22 + a13 * b32);
printf("%d %d \n", a21 * b11 + a22 * b21 + a23 * b31,
a21 * b12 + a22 * b22 + a23 * b32);
return 0;
}
基础操作
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 12;
struct Mat {
int mat[MAXN][MAXN];
int n, m;
Mat operator * (const Mat &b) const {
Mat a = *this;
Mat ans;
ans.n = a.n;
ans.m = b.m;
memset(ans.mat, 0, sizeof ans.mat);
for(int i = 0; i < ans.n; i++)
for(int j = 0; j < ans.m; j++)
for(int k = 0; k < a.m; k++)
ans.mat[i][j] += a.mat[i][k] * b.mat[k][j];
return ans;
}
void scan() {
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
scanf("%d", &mat[i][j]);
}
void print() {
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
printf("%d ", mat[i][j]);
}
printf("\n");
}
}
Mat qpow(int k) {
Mat ans;
ans.n = n;
ans.m = m;
for(int i = 0; i < ans.n; i++) {
for(int j = 0; j < ans.m; j++) {
ans.mat[i][j] = (i == j);
}
}
while(k) {
if(k & 1)
ans = ans * *this;
*this = *this * *this;
k >>= 1;
}
return ans;
}
};
int main() {
Mat m;
int n, k;
scanf("%d %d", &n, &k);
m.n = m.m = n;
m.scan();
Mat ans = m.qpow(k);
ans.print();
return 0;
}