如题
#include<bits/stdc++.h>
using namespace std;
typedef int ll;
const int MAXN=50;
ll n,k;
struct node{
ll k[MAXN][MAXN];
node(){
memset(k,0,sizeof k);
}
void danwei(){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
k[i][j]=0;
if(i==j) k[i][j]=1;
}
}
}
}A,O;
node mo(node a){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
a.k[i][j]%=10;
}
}return a;
}
node operator *(node a,node b){
node ans;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
for(int l=0;l<n;l++){
ans.k[i][j]+=a.k[i][l]*b.k[l][j];
}
}
}return mo(ans);
}
node operator +(node a,node b){
node ans;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
ans.k[i][j]=a.k[i][j]+b.k[i][j];
}
}return mo(ans);
}
node qpow(node aa,ll b){//A^b %P
node ans;
ans.danwei();
while(b){
if(b&1)
ans=mo(ans*aa);
aa=mo(aa*aa);
b>>=1;
}
return mo(ans);
}
node work(ll n){
if(n==0) return O;
if(n==1) return A;
if(n%2==0){
return work(n/2) * (qpow(A,n/2) + O);
}else{
node tmp=work(n-1);
node tmp2=qpow(A,n);
return tmp+tmp2;
}
}
int main(){
while(cin>>n>>k){
if(n==k&&n==0) break;
O.danwei();
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
long long x;
scanf("%lld",&x);
A.k[i][j]=x%10ll;
}
}
node ans=mo(work(k));
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("%d",ans.k[i][j]%10);
if(j!=n-1) printf(" ");
}
printf("\n");
}
printf("\n");
}
return 0;
}