#include<bits/stdc++.h>
#include<iostream>
const int b = 1000000000+7;
long long n,a[200][200],s[200][200],tmp[200][200];
long long m;
int i,j,k;
int main(){
std::cin>>n>>m;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++){
scanf("%lld",&a[i][j]);
s[i][j]=a[i][j];
}
m--;
while (m){
if (m%2) {
memset(tmp,0,sizeof(tmp));
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
for (k=1;k<=n;k++){
tmp[i][j]+=s[i][k]*a[k][j];
tmp[i][j]%=b;
}
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
s[i][j]=tmp[i][j];
}
memset(tmp,0,sizeof(tmp));
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
for (k=1;k<=n;k++){
tmp[i][j]+=a[i][k]*a[k][j];
tmp[i][j]%=b;
}
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
a[i][j]=tmp[i][j];
m/=2;
}
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
printf("%lld%c",s[i][j],j==n?'\n':' ');
return 0;
}
交了6遍才过,原因是源代码竟然没改!
矩阵快速幂 洛谷P3390
最新推荐文章于 2024-03-02 09:59:54 发布