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。


输入样例

2
2 2
1 0
0 1
3 99999999
1 2 3
4 5 6
7 8 9

输出样例

2
2686
没有任何变化的矩阵快速幂
附ac代码
#include<bits/stdc++.h>
using namespace std;
const int N=15;
int n;
struct matrix{
   long long grid[N][N];//开成long long
};
matrix c;
matrix multi(matrix a,matrix b)
{
    for(int i=0;i<n;++i)
     for(int j=0;j<n;++j)
     c.grid[i][j]=0;
    for(int i=0;i<n;++i)
       for(int j=0;j<n;++j)
        for(int z=0;z<n;++z)
        {c.grid[i][j]+=a.grid[i][z]*b.grid[z][j];
        c.grid[i][j]%=9973;//c的值%=不会影响最终值
        }
    return c;
}
matrix f(matrix a,int k)
{
    if(k==1) return a;
    matrix s;
    s=f(multi(a,a),k/2);
    if(k%2) s=multi(s,a);
    return s;
}
int main()
{
    int t,k;
    cin>>t;
    while(t--)
    {
    scanf("%d%d",&n,&k);
    matrix ans;
    for(int i=0;i<n;++i)
      for(int j=0;j<n;++j)
      {scanf("%lld",&ans.grid[i][j]);
      }
    ans=f(ans,k);
    long long sum=0;
    for(int i=0;i<n;++i)
    {
        sum+=ans.grid[i][i];//方阵的主对角线是左上角到右下角
        //副对角线是右上角到左下角;
        if(sum>=9973) sum%=9973;
    }
    printf("%lld\n",sum%9973);
    }
}

 

 posted on 2023-01-13 19:09  ruoye123456  阅读(78)  评论(0)    收藏  举报