Tr A(HDOJ 1575)
Problem Description
A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973。
Input
数据的第一行是一个T,表示有T组数据。
每组数据的第一行有n(2 <= n <= 10)和k(2 <= k < 10^9)两个数据。接下来有n行,每行有n个数据,每个数据的范围是[0,9],表示方阵A的内容。
Output
对应每组数据,输出Tr(A^k)%9973。
Sample Input
2 2 2 1 0 0 1 3 99999999 1 2 3 4 5 6 7 8 9
Sample Output
2 2686
My code
#include
#include
using namespace std;
struct Matrix //用一个结构体来表示矩阵
{
int M[15][15];
};
Matrix mul(Matrix m1, Matrix m2, int n) //矩阵乘法
{
Matrix m3;
memset(m3.M, 0, sizeof(m3.M));
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
for (int k = 0; k < n; k++)
m3.M[i][j] = (m3.M[i][j] + (m1.M[i][k] % 9973) * (m2.M[k][j] % 9973)) % 9973;
return m3;
}
int Tr(Matrix m, int n) //对角和
{
int ans = 0;
for (int i = 0; i < n; i++)
ans = (ans + m.M[i][i]) % 9973;
return ans;
}
Matrix pow(Matrix m, int k, int n) //就是普通的快速幂,把数的乘换成矩阵的乘
{
Matrix ans;
memset(ans.M, 0, sizeof(ans.M));
for (int i = 0; i < n; i++) //这是一个单位矩阵,相当于数字1,任何矩阵乘一个单位矩阵等于本身
ans.M[i][i] = 1;
while (k)
{
if (k & 1) //快速幂应该都会了吧
ans = mul(ans, m, n);
m = mul(m, m, n);
k >>= 1;
}
return ans;
}
int main()
{
int t;
int n, k;
Matrix m;
cin >> t;
while (t--)
{
cin >> n >> k;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cin >> m.M[i][j];
cout << Tr(pow(m, k, n), n) << endl;
}
return 0;
}