题目描述
给定n*n的矩阵A,求A^k
输入格式
第一行,n,k
第2至n+1行,每行n个数,第i+1行第j个数表示矩阵第i行第j列的元素
输出格式
输出A^k
共n行,每行n个数,第i行第j个数表示矩阵第i行第j列的元素,每个元素模10^9+7
样例输入
2 1 1 1 1 1
样例输出
1 1 1 1
题目分析:模板题,忘了可以时长看看加深印象,你们也可以常来关照呐!!!
AC代码
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<stdlib.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
ll x,y,N;
struct matrix{
ll dis[100][100];
};
ll MOD=1e9+7;
matrix mul(matrix a,matrix b)
{
matrix tmp;
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
{
tmp.dis[i][j]=0;
for(int k=1;k<=N;k++)
tmp.dis[i][j]=(tmp.dis[i][j]+a.dis[i][k]*b.dis[k][j]+MOD)%MOD;
}
return tmp;
}
matrix add(matrix a,ll n)
{
matrix A;
for(int i=1;i<=N;i++)
{
for(int j=1;j<=N;j++)
{
A.dis[i][j]=(i==j);
}
}
while(n)
{
if(n%2==1)
A=mul(A,a);
a=mul(a,a);
n/=2;
}
return A;
}
int main()
{
ll n,m;
while(scanf("%lld%lld",&n,&m)!=EOF)
{
N=n;
matrix b;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%lld",&b.dis[i][j]);
matrix a=add(b,m);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(j!=1)
printf(" ");
printf("%lld",a.dis[i][j]);
}
printf("\n");
}
}
return 0;
}