类似a^b的快速幂。很经典一道题。
#include<iostream> #include<cstdio> #include<cstring> typedef __int64 LL; using namespace std ; int n,M; LL k; struct matrax{ int m[35][35]; void unit(){ memset(m,0,sizeof(m)); for(int i=0;i<n;i++) m[i][i]=1; } matrax operator + (const matrax &a){ matrax c; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ c.m[i][j]=(m[i][j]+a.m[i][j])%M; } } return c; } matrax operator * (const matrax &a){ matrax c; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ c.m[i][j]=0; for(int k=0;k<n;k++) c.m[i][j]=(c.m[i][j]+m[i][k]*a.m[k][j])%M; } } return c; } }; matrax A; matrax operator ^ (matrax a,LL k) { matrax ans; ans.unit(); while(k){ if(k&1) ans=ans*a; a=a*a; k>>=1; } return ans; } matrax Sum(LL k) { if(k==1) return A; matrax tmp=Sum(k>>1); matrax tmp2; if(k&1){ tmp2=A^((k>>1)+1); return tmp+tmp2+tmp*tmp2; } else{ tmp2=A^(k>>1); return tmp+tmp*tmp2; } } int main() { int i,j; while(scanf("%d %I64d %d",&n,&k,&M)!=EOF){ for(i=0;i<n;i++){ for(j=0;j<n;j++){ scanf("%d",&A.m[i][j]); A.m[i][j]%=M; } } matrax ans=Sum(k); for(i=0;i<n;i++){ for(j=0;j<n;j++) printf(j==n-1?"%d\n":"%d ",ans.m[i][j]); } } return 0 ; }