矩阵快速幂模板
传送门
#include <bits/stdc++.h>
using namespace std;
long long n;
struct mat
{
long long g[110][110];
void clear()
{
memset (g, 0, sizeof (g));//清0
return ;
}
mat operator * (const mat& b)
{
mat tmp;//tmp要作为返回值
tmp.clear();//因为要累加,所以要事先清0
for (long long i = 0; i < n; i ++)//基本枚举,下同
for (long long j = 0; j < n; j ++)
for (long long k = 0; k < n; k ++)
tmp.g[i][j] += (g[i][k]*b.g[k][j])%1000000007, tmp.g[i][j] %= 1000000007;
return tmp;
}
void print()
{
for (long long i = 0; i < n; i ++, printf ("\n"))
for (long long j = 0; j < n; j ++)
printf ("%lld ", g[i][j]);
return ;//个人喜欢把输入输出封装一下,下同
}
void scan()
{
for (long long i = 0; i < n; i ++)
for (long long j = 0; j < n; j ++)
scanf ("%lld", &g[i][j]);
return ;
}
};
mat a;
mat mypow(long long k)
{
mat res;
res.clear();
for (long long i = 0; i < n; i ++)
res.g[i][i] = 1;
while (k)
{
if (k%2)
res =res*a;
k >>=1;
a =a*a;
}
return res;
}
long long k;
int main()
{
cin>>n>>k;
a.scan();
mat res=mypow(k);
res.print();
return 0;
}