典型的倍增法的应用,这里我用了递归的方式实现,这样比较直观,也比较好写(主要是因为迭代写的一直WA),注意输入的时候需要取模。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=50;
typedef int matrix[maxn][maxn];
int n,K;
void print_matrix(matrix A)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(j==n-1) printf("%d\n",A[i][j]%10);
else printf("%d ",A[i][j]%10);
}
puts("");
}
void mat_add(matrix A,matrix B,matrix res)
{
matrix C;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
C[i][j]=(A[i][j]+B[i][j])%10;
memcpy(res,C,sizeof(C));
}
void mat_mul(matrix A,matrix B,matrix res)
{
matrix C;
memset(C,0,sizeof(C));
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
for(int k=0;k<n;k++)
C[i][j]=(C[i][j]+(A[i][k]*B[k][j]))%10;
memcpy(res,C,sizeof(C));
}
void mat_pow(matrix A,int m,matrix res)
{
matrix r,a;
memset(r,0,sizeof(r));
memcpy(a,A,sizeof(a));
for(int i=0;i<n;i++) r[i][i]=1;
while(m)
{
if(m&1) mat_mul(r,a,r);
m>>=1;
mat_mul(a,a,a);
}
memcpy(res,r,sizeof(r));
}
matrix A,B;
void solve(int k,matrix res)
{
if(k==1)
{
memcpy(res,A,sizeof(A));
return;
}
matrix a,b,c,r;
solve(k/2,r);
mat_pow(A,k/2,a);
mat_mul(a,r,b);
mat_add(b,r,r);
if(k%2==1)
{
mat_mul(a,a,a);
mat_mul(a,A,a);
mat_add(r,a,r);
}
memcpy(res,r,sizeof(r));
}
int main()
{
while(scanf("%d%d",&n,&K)==2 && n)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
scanf("%d",&A[i][j]);
A[i][j]%=10;
}
if(K==0)
{
memset(A,0,sizeof(A));
for(int i=0;i<n;i++) A[i][i]=1;
print_matrix(A);
continue;
}
solve(K,B);
print_matrix(B);
}
return 0;
}