题目描述
给定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
输入输出样例
输入样例#1:
2 1
1 1
1 1
输出样例#1:
1 1
1 1
这里写代码片
#include<cstdio>
#include<cstring>
#include<iostream>
#define LL long long
using namespace std;
const LL mod=1000000007;
const int N=201;
LL k;
int n;
struct node{
LL m[101][101];
node operator * (const node &a) const
{
node ans;
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
{
ans.m[i][j]=0;
for (int k=1;k<=n;k++)
ans.m[i][j]=(ans.m[i][j]+(LL)m[i][k]*a.m[k][j])%mod;
//这给我们一个启示,取%时不能偷懒,还是要一步一步的进行
}
return ans;
}
void clear()
{
memset(m,0,sizeof(m));
}
node KSM(LL k)
{
k--;
node ans=(*this),a=(*this);
while (k)
{
if (k&1)
ans=ans*a;
a=a*a;
k>>=1;
}
return ans;
}
};
int main()
{
node m,ans;
scanf("%d%lld",&n,&k);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
scanf("%lld",&m.m[i][j]);
ans=m.KSM(k);
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
printf("%lld ",ans.m[i][j]);
printf("
");
}
return 0;
}