题意:给定矩阵A
求A+A^2+A^3+.......+A^k
如何转化
令SUM(k)==A+A^2+A^3+.......+A^k
则SUM(k)=(1 + A^(k/2) ) * (A+A^2+A^3+.......+A^k) + A^k (k为奇数)
=(1 + A^(k/2) ) * (A+A^2+A^3+.......+A^k) (k为偶数)
直接递归就好
AC代码
#include <bits/stdc++.h>
using namespace std;
struct Array{
int matrix[30][30];
}t;
int n,k,mod;
Array add(Array x,Array y)
{
Array res;
memset(res.matrix,0,sizeof(res.matrix));
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
res.matrix[i][j]=(x.matrix[i][j]+y.matrix[i][j])%mod;
return res;
}
Array mul(Array x,Array y)
{
Array res;
memset(res.matrix,0,sizeof(res.matrix));
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
for(int k=0;k<n;k++)
{
res.matrix[i][j]+=x.matrix[i][k]*y.matrix[k][j]%mod;
res.matrix[i][j]%=mod;
}
return res;
}
Array matrix_ksm(Array a,int b)
{
Array res,temp;
memset(res.matrix,0,sizeof(res.matrix));
for(int i=0;i<n;i++)res.matrix[i][i]=1;
temp=a;
while(b)
{
if(b&1)res=mul(res,temp);
temp=mul(temp,temp);
b>>=1;
}
return res;
}
Array sum(int k)
{
Array res;
if(k==0)
{
memset(res.matrix,0,sizeof(res.matrix));
return res;
}
Array nextsum=sum(k/2);
res=add(nextsum,mul(matrix_ksm(t,k/2),nextsum));
if(k&1)res=add(res,matrix_ksm(t,k));
return res;
}
int main()
{
//freopen("in.in","r",stdin);
while(scanf("%d%d%d",&n,&k,&mod)!=EOF)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&t.matrix[i][j]);
Array ans=sum(k);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
printf("%d ",ans.matrix[i][j]);
printf("\n");
}
}
}