https://www.luogu.com.cn/record/199887617
#include <iostream>
using namespace std;
long long n,k;
long long a[105][105],b[105][105],c[105][105],d[105][105];
const long long mod=1e9+7;
void chengfa(long long a[][105],long long b[][105],long long c[][105],long long n)//矩阵乘法函数
{// 乘数1 乘数2 积 矩阵阶数
for(long long i=1;i<=n;i++)
{
for(long long j=1;j<=n;j++)
{
long long t=0;
for(long long kk=1;kk<=n;kk++)
{
t+=(a[i][kk]*b[kk][j]);t%=mod;
}
c[i][j]=t;
}
}
}
void kuaisumi(int k)//快速幂函数
{
//c矩阵为结果矩阵
//a矩阵为输入矩阵
while(k)
{
if(k&1)
{
//c和a乘,结果存到d里
chengfa(c,a,d,n);
//把D拷过来拷到C里
for(long long i=1;i<=n;i++)
{
for(long long j=1;j<=n;j++)
{
c[i][j]=d[i][j];
}
}
}
//a自乘,结果存到B
chengfa(a,a,b,n);
//然后把B拷到A里
for(long long i=1;i<=n;i++)
{
for(long long j=1;j<=n;j++)
{
a[i][j]=b[i][j];
}
}
//k>>=1
k>>=1;
}
}
int main()
{
cin>>n;
cin>>k;
//0特判:0输出单位矩阵
if(k==0) {for(long long i=1;i<=n;i++){for(long long j=1;j<=n;j++){if(i==j) cout<<"1 ";else cout<<"0 ";}cout<<'\n';}return 0;}
//输入
for(long long i=1;i<=n;i++)
{
for(long long j=1;j<=n;j++)
{
cin>>a[i][j];
if(i==j) c[i][j]=1;//把C初始化成单位矩阵
}
}
//快速幂
kuaisumi(k);
//结果输出
for(long long i=1;i<=n;i++)
{
for(long long j=1;j<=n;j++)
{
cout<<c[i][j]<<' ';
}
cout<<'\n';
}
return 0;
}