矩阵快速幂+二分 poj3233
1 #include <iostream> 2 #include <cstdio> 3 #include <string> 4 #include <cstring> 5 #include <stdlib.h> 6 #include <math.h> 7 #include <ctype.h> 8 #include <queue> 9 #include <map> 10 #include <set> 11 #include <algorithm> 12 13 using namespace std; 14 int mod; 15 int n; 16 struct matrix 17 { 18 int ma[40][40]; 19 }init, res; 20 matrix Mult(matrix x, matrix y) 21 { 22 int i,j,k; 23 matrix tmp; 24 memset(tmp.ma,0,sizeof(tmp.ma)); 25 for(i=0;i<n;i++) 26 for(j=0;j<n;j++) 27 for(k=0;k<n;k++) 28 tmp.ma[i][j]=(tmp.ma[i][j]+x.ma[i][k]*y.ma[k][j])%mod; 29 return tmp; 30 } 31 matrix Pow(matrix x, int k) 32 { 33 matrix tmp; 34 int i,j; 35 memset(tmp.ma,0,sizeof(tmp.ma)); 36 for(i=0;i<n;i++) tmp.ma[i][i]=1; 37 while(k){ 38 if(k&1) tmp=Mult(tmp,x); 39 x=Mult(x,x); 40 k>>=1; 41 } 42 return tmp; 43 } 44 matrix add(matrix x, matrix y) 45 { 46 int i, j; 47 matrix tmp; 48 for(i=0;i<n;i++) 49 for(j=0;j<n;j++) 50 tmp.ma[i][j]=(x.ma[i][j]+y.ma[i][j])%mod; 51 return tmp; 52 } 53 matrix sum(matrix x, int k) 54 { 55 matrix tmp, y; 56 if(k==1) return x; 57 tmp=sum(x,k/2); 58 if(k&1){ 59 y=Pow(x,k/2+1); 60 tmp=add(Mult(y,tmp),tmp); 61 return add(tmp,y); 62 } 63 else{ 64 y=Pow(x,k/2); 65 return add(Mult(y,tmp),tmp); 66 } 67 } 68 int main() 69 { 70 int k,m,x,i,j; 71 scanf("%d%d%d",&n,&k,&mod); 72 for(i=0;i<n;i++){ 73 for(j=0;j<n;j++){ 74 scanf("%d",&x); 75 init.ma[i][j]=x%mod; 76 } 77 } 78 res=sum(init, k); 79 for(i=0;i<n;i++){ 80 for(j=0;j<n;j++){ 81 printf("%d",res.ma[i][j]); 82 if(j!=n-1) printf(" "); 83 } 84 puts(""); 85 } 86 return 0; 87 }