- 原貼 http://blog.csdn.net/mark_meego/article/details/8654619
- 題目描述:
-
給定一個n*n的矩陣,求該矩陣的k次冪,即P^k。
- 輸入:
-
輸入包含多組測試數據。
數據的第一行爲一個整數T(0<T<=10),表示要求矩陣的個數。
接下來有T組測試數據,每組數據格式如下:
第一行:兩個整數n(2<=n<=10)、k(1<=k<=5),兩個數字之間用一個空格隔開,含義如上所示。
接下來有n行,每行n個正整數,其中,第i行第j個整數表示矩陣中第i行第j列的矩陣元素Pij且(0<=Pij<=10)。另外,數據保證最後結果不會超過10^8。 - 輸出:
-
對於每組測試數據,輸出其結果。格式爲:
n行n列個整數,每行數之間用空格隔開,注意,每行最後一個數後面不應該有多餘的空格。 - 樣例輸入:
-
3 2 2 9 8 9 3 3 3 4 8 4 9 3 0 3 5 7 5 2 4 0 3 0 1 0 0 5 8 5 8 9 8 5 3 9 6 1 7 8 7 2 5 7 3
- 樣例輸出:
-
153 96 108 81 1216 1248 708 1089 927 504 1161 1151 739 47 29 41 22 16 147 103 73 116 94 162 108 153 168 126 163 67 112 158 122 152 93 93 111 97
-
-
由於時間比較倉促,忽略題目的一些細節要求。
-
-
代碼:
-
#include <stdio.h> #include <cstring> #define T 10 struct matrix { int m[T][T]; }res,origin[T]; void calmatrix(matrix ori[],int q[][2],int matrix_count); //聲明 matrix multiply(matrix x,matrix y,int n); int main(void) { int matrix_count; int matrix_n_k[T][2]; do { scanf("%d",&matrix_count); if(matrix_count>0) { for(int i=0;i<matrix_count;i++) { scanf("%d %d",&matrix_n_k[i][0],&matrix_n_k[i][1]); for(int j=0;j<matrix_n_k[i][0];j++) for(int k=0;k<matrix_n_k[i][0];k++) scanf("%d",&origin[i].m[j][k]); } calmatrix(origin,matrix_n_k,matrix_count); } }while(matrix_count!=0); printf("finish\n"); return 0; } void calmatrix(matrix ori[],int q[][2],int matrix_count) { int a,b; for(int count=0;count<matrix_count;count++) { int n=q[count][1]; //多少次冪 memset(res.m,0,sizeof(res.m)); for( a=0;a<q[count][0];a++) res.m[a][a]=1; //將res.m初始化爲單位矩陣 //這裏用到二進制思想,如A^156,而156(10)=10011100(2) ,也就有A^156=>(A^4)*(A^8)*(A^16)*(A^128) while(n) { if(n&1) //判斷是否是奇數 { res=multiply(res,ori[count],q[count][0]);//q代表幾階(幾行幾列) } ori[count]=multiply(ori[count],ori[count],q[count][0]); n>>=1; //將n的二進制表示向右移動一位再賦值給n } for( a=0;a<q[count][0];a++) { for( b=0;b<q[count][0];b++) printf("%d ",res.m[a][b]); printf("\n"); } } } matrix multiply(matrix x,matrix y,int n) { int a,b,c; matrix temp; memset(temp.m,0,sizeof(temp.m)); for(a=0;a<n;a++) for( b=0;b<n;b++) for( c=0;c<n;c++) temp.m[a][b]+=x.m[a][c]*y.m[c][b]; return temp; }
我是小菜鳥啊