If k is even, then (a+a^2+ ...). A^K) = (A+...+A^K/2) +a^k/2* (A+...+A^K/2)
If k is odd, then (a+a^2+ ...). A^K) = (A+...+A^K/2) +a^k/2* (A+...+A^K/2) +a^k
Then the second solution can be. The idea is simple.
Next, the question of optimization:
-------------------------------TLE
g++ is less time-consuming than C + +. -2391ms
Nothing to initialize without being idle. -1782ms
Try to minimize the number of times it takes. -1125ms
#include <stdio.h> #include <string.h> #include <algorithm> #include <iostream> using namespace
Std
#define NNUM #define MNUM #define LL long struct matrix {int mat[31][31];
int n,m;
Matrix one;
Matrix Mul (A,matrix B)//matrices multiplication {int i,j,k;
Matrix C;
for (i=1;i<=n;i++) {for (j=1;j<=n;j++) {c.mat[i][j]=0;
for (k=1;k<=n;k++) {c.mat[i][j]= (a.mat[i][k]*b.mat[k][j]+c.mat[i][j])%m;
}} return C;
Matrices Add (Matrix A,matrix B)//matrixes Add {int i,j;
for (i=1;i<=n;i++) {for (j=1;j<=n;j++) {a.mat[i][j]+=b.mat[i][j];
a.mat[i][j]=a.mat[i][j]%m;
} return A;
} Matrix Powmul (Matrix A,int k)//a matrices of K-th square {if (k==1) return A;
Matrix B=powmul (A,K/2);
B=mul (B,B);
if (k%2) B=mul (b,a);
return B;
Matrix DOS (Matrix A,int k) {if (k==1) return A; if (k%2==0) {Matrix b=dos (A,K/2);
Return Mul (Add (Powmul (A,K/2), one), B);
else {matrix B=dos (A, (k)/2);
Matrix C=powmul (A, (k+1)/2);
Return Add (C,mul (B,add (C,one)));
int main () {int k,i,j;
Matrix A;
scanf ("%d%d%d", &n,&k,&m);
for (i=1;i<=n;i++) {one.mat[i][i]=1;
for (j=1;j<=n;j++) {scanf ("%d", &a.mat[i][j]);
} Matrix Ans=dos (A,K);
for (i=1;i<=n;i++) {for (j=1;j<=n;j++) {if (j!=1) cout<< "";
printf ("%d", (Ans.mat[i][j])%m);
} cout<<endl;
return 0;
}