您的位置:首页 > 其它

【学习笔记】〖九度OJ〗题目1443:Tr A

2014-03-09 16:46 344 查看
题目1443:Tr A

时间限制:1 秒

内存限制:128 兆

特殊判题:否

提交:283

解决:168

题目描述:

A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973。

输入:

数据的第一行是一个T,表示有T组数据。

每组数据的第一行有n(2 <= n <= 10)和k(2 <= k < 10^9)两个数据。接下来有n行,每行有n个数据,每个数据的范围是[0,9],表示方阵A的内容。

输出:

对应每组数据,输出Tr(A^k)%9973。

样例输入:
2
2 2
1 0
0 1
3 99999999
1 2 3
4 5 6
7 8 9


样例输出:
2
2686


本题难度不大,定义了矩阵类,重载了乘法运算符,求幂部分利用了二分求幂法以节省时

间。

#include<iostream>
using namespace std;
#define MOD 9973

class Matrix
{
public:
int m[11][11];
int n;//方阵的行数
int tr;
Matrix()
{
tr = 0;
for (int i=0; i<11; i++)
{
for (int j=0; j<11; j++)
{
m[i][j] = 0;
}
}
}
Matrix(int n)
{
tr = 0;
this->n = n;
for (int i=0; i<n; i++)
{
for (int j=0; j<n; j++)
{
m[i][j] = 0;
}
}

}
void getT(int n)
{

tr=0;
for (int i=0; i<n; i++)
{
tr = (tr + m[i][i])%MOD;
}
}

Matrix operator * (const Matrix a) const
{
Matrix res;
res.n = n;
for (int i=0; i<n; i++)
{
for (int j=0; j<n; j++)
{
res.m[i][j] = 0;
for (int k=0; k<n; k++)
{
res.m[i][j] = (res.m[i][j] + (m[i][k] * a.m[k][j]) % MOD) % MOD;
}
}
}
return res;
}
};

int main()
{
freopen("input.in", "r", stdin);
freopen("output.out","w", stdout);

int num;
while (cin >> num && num!=0)
{

int n, k, i, j, x, y, z;
for (i=0; i<num; i++)//每组一次
{

//输入部分
cin >> n >> k;
Matrix mtx(n);
for (x=0; x<n; x++)
{
for (y=0; y<n; y++)
{
cin >> mtx.m[x][y];
}
}

//计算部分
int tmp = k;
Matrix res(n);
for (z=0; z<n; z++)
{
res.m[z][z] = 1;
}
while (k>0)
{
if (k%2 == 1)
{
res = res * mtx;
}
mtx = mtx*mtx;
k/=2;
}
res.getT(n);
cout << res.tr << endl;
}//end of for
}//end of while

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: