还是矩阵的快速幂。。。
只要令Sk=I+A+A^2+.....A^(k-1)
则有 Ak = | A 0 | Ak-1 = | A 0 | ^ k |
Sk | I I | Sk-1 | I I | 0
其中I是单位矩阵
最后矩阵的左下角的那个小矩阵就是要求的(只不过要减去一个单位矩阵)
#include<stdio.h>
struct node
{
int c[70][70];
}FAB;
int n,m,k;
struct node B;
struct node mul(struct node *a,struct node *b)
{
struct node t;
int i,j,k;
for(i=0;i<2*n;i++)
for(j=0;j<2*n;j++)
t.c[i][j]=0;
for(i=0;i<2*n;i++)
for(j=0;j<2*n;j++)
for(k=0;k<2*n;k++)
{
t.c[i][j]=(t.c[i][j]+a->c[i][k]*b->c[k][j])%m;
}
return t;
}
struct node power(struct node *a,int num)
{
struct node temp;
int i,j;
for(i=0;i<2*n;i++)
for(j=0;j<2*n;j++)
{
if(i==j)
temp.c[i][j]=1;
else
temp.c[i][j]=0;
}
while(num>0)
{
if(num&1)
temp=mul(&temp,a);
*a=mul(a,a);
num>>=1;
}
return temp;
}
int main(void)
{
int a,i,j;
scanf("%d%d%d",&n,&k,&m);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&FAB.c[i][j]);
B.c[i][j]=FAB.c[i][j];
}
B.c[n+i][i]=B.c[n+i][n+i]=1;
}
B=power(&B,k+1);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
a=B.c[n+i][j]%m;
if(i==j)
a=(a+m-1)%m;
printf("%d ",a);
}
printf("\n");
}
}