思路:
1.重载矩阵运算符,定义矩阵乘法或者重载矩阵
2.按照快速幂的思想,循环计算或者递归计算
注意点:表示结果的矩阵要定义为单位矩阵
不使用重载:
#include<iostream>
#include<algorithm>
#include <map>
#include <unordered_map>
#include <queue>
#include<cstdio>
#include<string>
using namespace std;
#define LL long long
#define N 105
#define Md 1000000007
LL n, m, i, j, k;
LL res[N][N];
LL tmp[N][N];
LL s[N][N];
void clear(LL a[][N])
{
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
a[i][j] = 0;
}
}
}
void ResMul(LL a[][N], LL b[][N])
{
clear(tmp);
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
for (k = 0; k < n; k++)
{
//printf("a[i][k]=%lld b[k][i]=%lld\n", a[i][k], b[k][i]);
tmp[i][j] += a[i][k] * b[k][j] % Md;
tmp[i][j] %= Md;
}
}
}
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
res[i][j] = tmp[i][j];
}
}
}
void AMul(LL a[][N], LL b[][N])
{
clear(tmp);
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
for (k = 0; k < n; k++)
{
tmp[i][j] += a[i][k] * b[k][j] % Md;
tmp[i][j] %= Md;
}
}
}
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
s[i][j] = tmp[i][j];
}
}
}
int main()
{
cin >> n >> m;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
cin >> s[i][j];
}
}
for (i = 0; i < n; i++)
{
res[i][i] = 1;//单位矩阵
}
while (m)//快速幂
{
if (m & 1)
{
ResMul(res,s);
}
AMul(s, s);
m >>= 1;
}
for (i = 0; i < n; i++)//输出结果
{
for (j = 0; j < n; j++)
{
cout << res[i][j] << ' ';
}
cout << endl;
}
return 0;
}
重载:
学习中,学习链接:C++-重载运算符-矩阵(示例代码)_136.la