描述
描述很简单:
计算[M*M]^D,其中[M*M]表示一个M*M的矩阵,D是一个正整数;
-
输入
-
第一行包含一个整数T,表示有T组数据;
对于每组数据,第一行包含2个整数M,D,意思如题目描述;
然后是一个M×M的矩阵
M不超过10,D不超过100,0000
输出
-
输出一个M*M的矩阵
考虑到数字可能太大,所以对于每个元素请取模 10000
样例输入
1
1 1
1
样例输出
1
此题需要用到二分法
比如矩阵A, A的n次方A^n ,
当n为偶数时,A^n= A^(n/2 + n/2) = A^(n/2) * A^(n/2),
当n为奇数时,A^n= A^(n/2 + n/2 + 1) = A^(n/2) * A^(n/2) * A,
#include <iostream> #include <cstdio> using namespace std; int T; int n, k; typedef struct Matrix { int ma[15][15]; }Matrix; Matrix A; // 矩阵A Matrix B; // 保存最后的结果 Matrix unit;// 单位矩阵,用于在下面的fun函数中 const int MOD = 10000; // 两个矩阵相乘 Matrix Mul(Matrix m1, Matrix m2) { Matrix c; for(int i=0; i<n; ++i) for(int j=0; j<n; ++j) { c.ma[i][j] = 0; for(int k=0; k<n; ++k) c.ma[i][j] += m1.ma[i][k] * m2.ma[k][j]; c.ma[i][j] %= MOD; } return c; } // 二分法求矩阵的幂 // 这个函数自己把num设为一个值,试试,推荐num=27 void fun(int num) { Matrix in = A; Matrix un = unit; while(num > 1) { if(num & 1) // 为奇数时,则减一 { --num; un = Mul(in, un); // 这里可以体会下为何un要被设置成单位矩阵 } else { num >>= 1; in = Mul(in, in); } } B = Mul(in, un); } int main() { scanf("%d", &T); while(T--) { scanf("%d %d", &n, &k); for(int i=0; i<n; ++i) for(int j=0; j<n; ++j) { scanf("%d", &A.ma[i][j]); B.ma[i][j] = 0; unit.ma[i][j] = (i==j); } fun(k); int ans = 0; for(int i=0; i<n; ++i) { for(int j=0;j<n-1;j++) { printf("%d ",B.ma[i][j]%MOD); } printf("%d\n",B.ma[i][n-1]%MOD); } } return 0; }