Tr A HDU 1575 (矩阵快速幂)
1 #include<iostream> 2 #include<vector> 3 #include<string> 4 #include<cmath> 5 #include<algorithm> 6 #include<cstdio> 7 #include<cstring> 8 #include<list> 9 10 using namespace std; 11 12 #define maxn 15 13 int n, k; 14 struct matrix//定义一个结构体,方便传递值 15 { 16 int m[maxn][maxn]; 17 }; 18 19 /* 20 maxn和mod由全局定义,其中mod根据需要可以省去 21 */ 22 23 matrix mul(matrix a, matrix b) //矩阵求积, 矩阵乘法 24 { 25 matrix ans; 26 for(int i = 1; i <= n; i++) 27 { 28 for(int j = 1; j <= n; j++) 29 { 30 ans.m[i][j] = 0; 31 for(int k = 1; k <= n; k++) 32 { 33 ans.m[i][j] += (a.m[i][k] * b.m[k][j]) % 9973; 34 ans.m[i][j] %= 9973; 35 } 36 } 37 } 38 return ans; 39 } 40 41 matrix quick_pow(matrix a, int b) //矩阵快速幂 42 { 43 matrix ans; 44 for(int i = 1; i <= n; i++) 45 { 46 for(int j = 1; j <= n; j++) 47 { 48 if(i == j) 49 ans.m[i][j] = 1; 50 else 51 ans.m[i][j] = 0;//这里要初始化为单位矩阵,类比普通快速幂这里初始化为1 52 } 53 } 54 while(b != 0)//方法与普通快速幂相同,只有乘法的实现不同 55 { 56 if(b % 2 == 1) 57 ans = mul(a, ans); 58 a = mul(a, a); 59 b /= 2; 60 } 61 62 return ans; 63 } 64 65 66 int main() 67 { 68 int T; 69 cin >> T; 70 while(T--) 71 { 72 matrix a; 73 74 cin >> n >> k; 75 for(int i = 1; i<= n; ++i) 76 for(int j = 1; j <= n; ++j) 77 cin >> a.m[i][j]; 78 79 matrix tmp = quick_pow(a, k); 80 int ans = 0; 81 for(int i = 1; i<= n; ++i) 82 ans += tmp.m[i][i] % 9973; 83 84 ans %= 9973; // 最后这里一定要再次取余! 85 cout << ans << endl; 86 } 87 88 89 return 0; 90 }