zoukankan      html  css  js  c++  java
  • 【学习笔记】〖九度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;
    }


  • 相关阅读:
    [LintCode] 最长上升子序列
    [LintCode] 最长公共前缀
    [LintCode] A + B 问题
    [hihoCoder] 拓扑排序·一
    [LintCode] 拓扑排序
    [LintCode] 第k大元素
    [LintCode] 最小路径和
    [LeetCode] Factorial Trailing Zeros
    [LintCode] 尾部的零
    [LeetCode] Length of Last Word
  • 原文地址:https://www.cnblogs.com/ymjia/p/3590297.html
Copyright © 2011-2022 走看看