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

题目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;
}


posted @ 2014-03-09 16:46  神枪打麦手  阅读(182)  评论(0编辑  收藏  举报