版权声明:禁止copy抄袭,博主很凶的哦,超级凶的那种哦。 https://blog.csdn.net/Strawberry_595/article/details/81215821
日常存一下板子:
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int maxn = 50;
const int mod = 1e9 + 7;
int n, k;
struct Matrix
{
int m[maxn][maxn];
};
Matrix operator * (Matrix a, Matrix b)
{
Matrix c;
memset(c.m, 0,sizeof(c.m));
for(int i = 1;i <= n;i++){ //row
for(int j = 1;j <= n;j++){ //col
for(int k = 1;k <= n;k++){
c.m[i][j] = (c.m[i][j] + a.m[i][k] * b.m[k][j] + mod) % mod;
}
}
}
return c;
}
Matrix operator ^ (Matrix a, int y) //传入a矩阵 ,y次幂
{
Matrix c; //c为结果矩阵
memset(c.m , 0, sizeof(c.m));
for(int i = 1;i <= n;i++)
c.m[i][i] = 1; //初始化
while(y > 0){
if(y & 1) c = c * a; //你当做正常快速幂理解就行 矩阵相乘往上Matrix operator *;
a = a * a;
y = y >> 1;
}
return c;
}
Matrix r , tmp;
int main()
{
while(scanf("%d %d",&n,&k) != EOF) //n * n的矩阵,矩阵k次幂;
{
for(int i = 1;i <= n;i++)
for(int j = 1;j <= n;j++)
scanf("%d",&r.m[i][j]); //输入矩阵
tmp = r ^ k; //实行r矩阵的k次幂 ,往上Matrix operator ^;
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++){
printf("%d " ,tmp.m[i][i]); //输出结果
}
printf("\n");
}
}
return 0;
}