矩阵的乘法:
Matrix:
乘法: A*B ,需要A的列数=B的行数
矩阵 C = A*B
则: C[i,j] = ∑A[i,k]*B[k,j]
矩阵的乘法代码:
//矩阵的乘法 void mul(int A[][MAXN],int B[][MAXN])//A=A*B { int R[MAXN][MAXN]; memset(R,0,sizeof(R)); for(int k=0;k<N;k++) for(int i=0;i<N;i++)if(A[i][k]) for(int j=0;j<N;j++) R[i][j]+=A[i][k]*B[k][j]; /* 如果取余可能能加快计算 int R[MAXN][MAXN]; for(int i=0;i<N;i++) for(int j=0;j<N;j++) { long long sum = 0; for(int k=0;k<N;k++) sum+=A[i][k]*B[k][j]; R[i][j]=sum%MOD; } */ for(int i=0;i<N;i++) for(int j=0;j<N;j++) A[i][j]=R[i][j]; }
矩阵快速幂模板:
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 5 int n, k, M; 6 struct mat{ 7 int ma[65][65]; 8 mat() {memset(ma, 0, sizeof(ma));}//¹¹ÔìÁã¾ØÕó 9 mat(int a) //¹¹Ô쵥λ¾ØÕó 10 { 11 memset(ma, 0, sizeof(ma)); 12 for(int i=0; i<n; i++) 13 ma[i][i] = 1; 14 } 15 void operator *= (const mat &x)//¾ØÕó³Ë·¨ 16 { 17 mat tmp; 18 int i, j, k; 19 for( k=0; k<n; k++) 20 for( i=0; i<n; i++) 21 if(ma[i][k]) 22 { long long tot=0; 23 for( j=0; j<n; j++) 24 tot += ma[i][k]*x.ma[k][j]; 25 ma[i][j] = tot%M; 26 } 27 for(i=0; i<n; i++) 28 for(j=0; j<n; j++) 29 ma[i][j] = tmp.ma[i][j]; 30 } 31 }; 32 mat pow_mod(mat a, int b)//¾ØÕó¿ìËÙÃÝ 33 { 34 mat tmp = mat(1); 35 while(b>0) 36 { 37 if(b&1) tmp*=a; 38 b>>=1; 39 a*=a; 40 } 41 return tmp; 42 } 43 44 int main() 45 { 46 while(scanf("%d%d%d", &n, &k, &M)==3) 47 { 48 mat A, B; 49 for(int i=0; i<n; i++) 50 for(int j=0; j<n; j++) 51 scanf("%d", &A.ma[i][j]); 52 printf(" "); 53 mat ans = pow_mod(A, k+1); 54 for(int i=0; i<n; i++) 55 { 56 for(int j=0; j<n; j++) 57 printf("%8d", ans.ma[i][j]); 58 printf(" "); 59 } 60 } 61 return 0; 62 }