Test instructions: to a n*n matrix A, the sum of the K power and S = a + a2 + a3 + ... + Ak
Idea: Matrix fast power.
#include <cstdio>#include<cstring>#include<algorithm>using namespaceStd;typedefstructnode{intmatrix[ -][ -];} Matrix; Matrix A,sa,unit;intn,m,k,i,j; Matrix Add (Matrix A,matrix B)//Matrix plus{Matrix C; for(i=0; i<n;i++) { for(j=0; j<n;j++) {C.matrix[i][j]=a.matrix[i][j]+B.matrix[i][j]; C.MATRIX[I][J]%=m; } } returnC;} Matrix Mul (Matrix A,matrix B)//matrix multiplication{Matrix C; for(i=0; i<n;i++) { for(j=0; j<n;j++) {C.matrix[i][j]=0; for(intH=0; h<n;h++) {C.matrix[i][j]=c.matrix[i][j]+a.matrix[i][h]*B.matrix[h][j]; } C.matrix[i][j]%=m; } } returnC;} Matrix Cal (intE//Power of Matrix{Matrix p,q; P=a;q=Unit; while(e!=1) { if(e&1) {e--; Q=Mul (P,Q); } Else{e/=2; P=Mul (p,p); }} P=Mul (P,Q); returnp;} Matrix sum (intK//The sum of power{ if(k==1)returnA; Matrix Temp,tnow; Temp=sum (k/2); if(k&1) {Tnow=cal (k/2+1); Temp=Add (Temp,mul (Temp,tnow)); Temp=Add (tnow,temp); } Else{Tnow=cal (k/2); Temp=Add (Temp,mul (Temp,tnow)); } returntemp;}intMain () {inti,j,l; while(SCANF ("%d%d%d", &n,&k,&m)! =EOF) { for(i=0; i<n;i++) { for(j=0; j<n;j++) {scanf ("%d",&A.matrix[i][j]); A.MATRIX[I][J]%=m; UNIT.MATRIX[I][J]= (I==J);//Unit Matrix}} sa=sum (k);//The result of a power of K for(i=0; i<n;i++) { for(j=0; j<n-1; j + +) {printf ("%d", sa.matrix[i][j]%m);//Modulo the M} printf ("%d\n", sa.matrix[i][n-1]%m); } } return 0;}
Poj matrix power Series matrices sum