<题目链接>
大幅度照抄队友的,觉着自己有些侵权,不大好意思发。
原版,戳友链第一个……
然而还是不要脸地发一个。
#include <cstdio>
#include <cstring>
const int MAXN=110,p=1e9+7;
int n;
long long k;
class matrix
{
public:
matrix(void)
{
memset(c,0,sizeof c);
}
void Read(void)
{
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
scanf("%lld",&c[i][j]);
}
void Print(void)
{
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
printf("%lld ",c[i][j]);
printf("
");
}
}
void Pow(long long k)
{
matrix a=(*this),ans;
for(int i=1;i<=n;++i)
ans.c[i][i]=1;
while(k)
{
if(k&1LL)
ans=ans*a;
a=a*a;
k>>=1;
}
memcpy(c,ans.c,sizeof ans.c);
}
matrix operator *(const matrix &b) const
{
matrix t,a=(*this);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
{
t.c[i][j]=0;
for(int k=1;k<=n;++k)
(t.c[i][j]+=a.c[i][k]*b.c[k][j])%=p;
}
return t;
}
private:
long long c[MAXN][MAXN];
}s;
int main(int argc,char *argv[])
{
scanf("%d %lld",&n,&k);
s.Read();
s.Pow(k);
s.Print();
return 0;
}
感谢队友的不控诉之恩。