Matrix Multiplication (& Quick Power)
Description
给出方阵 A 和整数 k ,求 (A^k)%9973 的迹(即主对角线上各项的和)。
Type
Matrix Multiplication
Quick Power
Analysis
矩阵乘法和快速幂,其实快速幂是废话,矩阵乘法一般都需要结合快速幂。
原来矩阵乘法有蛮多要注意的,例如一些初始化和单位矩阵的问题。
但是套了模板一切都搞定了……
所以这里也不再赘述了……
// HDOJ 1575 // Tr A // by A Code Rabbit #include <cstdio> #include <cstring> const int MAXO = 12; const int MOD = 9973; template <typename T> struct Matrix { T e[MAXO][MAXO]; int o; Matrix(int x) { memset(e, 0, sizeof(e)); o = x; } Matrix operator*(const Matrix& one) { Matrix res(o); for (int i = 0; i < o; i++) { for (int j = 0; j < o; j++) { for (int k = 0; k < o; k++) res.e[i][j] += e[i][k] * one.e[k][j]; res.e[i][j] %= MOD; } } return res; } Matrix operator*=(const Matrix& one) { return *this = *this * one; } }; template <typename T> T QuickPower(T radix, int exp) { T res = radix; exp--; while (exp) { if (exp & 1) res *= radix; exp >>= 1; radix *= radix; } return res; } int n, k; int GetTrace(Matrix<int> a); int main() { int tot_case; scanf("%d", &tot_case); while (tot_case--) { // Input. scanf("%d%d", &n, &k); Matrix<int> one(n); for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) scanf("%d", &one.e[i][j]); // Solve. Matrix<int> ans = QuickPower(one, k); // Output. printf("%d\n", GetTrace(ans)); } return 0; } int GetTrace(Matrix<int> a) { int sum = 0; for (int i = 0; i < n; ++i) sum += a.e[i][i]; return sum % MOD; }