九度oj 1443

来源:互联网 发布:手机淘宝如何扫码 编辑:程序博客网 时间:2024/06/07 13:08
题目描述:

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。

样例输入:
22 21 00 13 999999991 2 34 5 67 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()  {          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;  }  

本题代码为参考代码!

0 0
原创粉丝点击