S = A + A2 + A3 + … + Ak. (推矩阵公式+矩阵幂运算)
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <string> 7 #include <vector> 8 #include <set> 9 #include <map> 10 #include <stack> 11 #include <queue> 12 #include <sstream> 13 #include <iomanip> 14 using namespace std; 15 typedef long long LL; 16 const int INF=0x4fffffff; 17 const double EXP=1e-5; 18 const int MS=31; 19 const int SIZE=1000; 20 21 int n,k,mod; 22 typedef vector<vector<int> > mat; 23 24 mat A; 25 // calc A*B 26 27 mat mul(mat &A,mat &B) 28 { 29 mat C(A.size(),vector<int>(B[0].size())); 30 31 for(int i=0;i<A.size();i++) 32 { 33 for(int k=0;k<B.size();k++) 34 { 35 for(int j=0;j<B[0].size();j++) 36 { 37 C[i][j]=(C[i][j]+(LL)A[i][k]*B[k][j])%mod; // note overflow 38 } 39 } 40 } 41 return C; 42 } 43 44 // calc A^n 45 46 mat pow(mat A,int n) 47 { 48 mat B(A.size(),vector<int>(A[0].size())); 49 for(int i=0;i<A.size();i++) 50 B[i][i]=1; 51 while(n>0) 52 { 53 if(n&1) 54 B=mul(B,A); 55 A=mul(A,A); 56 n>>=1; 57 } 58 return B; 59 } 60 61 void solve() 62 { 63 mat B(2*n,vector<int>(2*n)); // init 0 64 // B_init(); 65 for(int i=0;i<n;i++) 66 { 67 for(int j=0;j<n;j++) 68 B[i][j]=A[i][j]; 69 B[n+i][i]=B[n+i][n+i]=1; 70 } 71 B=pow(B,k+1); 72 // ans=s[k+1]-1; 73 for(int i=0;i<n;i++) 74 { 75 for(int j=0;j<n;j++) 76 { 77 if(j) 78 printf(" "); 79 int a=B[n+i][j]%mod; 80 if(i==j) 81 a=(a+mod-1)%mod; 82 printf("%d",a); 83 } 84 printf("\n"); 85 } 86 } 87 88 int main() 89 { 90 scanf("%d%d%d",&n,&k,&mod); 91 A.resize(n); 92 for(int i=0;i<n;i++) 93 A[i].resize(n); 94 for(int i=0;i<n;i++) 95 for(int j=0;j<n;j++) 96 scanf("%d",&A[i][j]); 97 solve(); 98 return 0; 99 }