考查矩阵乘法,加矩阵快速幂。
先构造矩阵res为 I I ,I指单位矩阵,然后构造矩阵maxtri为 A 0
0 0 I I
所以相乘一次后 res*maxtri= A+I I ,在相乘一次就有了A^2+A+I I
0 0 0 0
这样规律就不难看出了,就是把res乘以A矩阵K次,就是一个快速幂的过程,最后的答案则只需减去一个单位矩阵即可。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=62;
int n,k,m;
int maxtri[N][N],tmp[N][N],res[N][N],tmp1[N][N];
void mul(int a[][N],int b[][N])
{
int tp;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
tp=0;
for(int t=1;t<=n;t++)
tp=(tp+(a[i][t]*b[t][j])%m)%m;
tmp[i][j]=tp;
}
}
void modexp(int t)
{
memcpy(tmp1,maxtri,sizeof(maxtri));
while(t)
{
if(t&0x1)
{
mul(res,tmp1);
memcpy(res,tmp,sizeof(tmp));
}
mul(tmp1,tmp1);
memcpy(tmp1,tmp,sizeof(tmp));
t>>=1;
}
}
int main()
{
cin>>n>>k>>m;
memset(res,0,sizeof(res));
memset(maxtri,0,sizeof(maxtri));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
cin>>maxtri[i][j];
maxtri[i][j]%=m;
}
for(int i=1;i<=n;i++)
{
maxtri[i+n][i]=1;
maxtri[i+n][i+n]=1;
res[i][i]=1;
res[i][i+n]=1;
}
n*=2;
modexp(k);
n/=2;
for(int i=1;i<=n;i++)
res[i][i]=(res[i][i]-1+m)%m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
cout<<res[i][j]<<" ";
cout<<endl;
}
return 0;
}