Tr A
- 题目描述:
-
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<stdio.h> typedef struct matrix { int m[15][15]; }matrix; matrix mul(matrix x,matrix y,int n) { matrix ans; for(int i=0;i<n;++i) { for(int j=0;j<n;++j) { ans.m[i][j]=0; for(int k=0;k<n;++k) { ans.m[i][j]+=x.m[i][k]*y.m[k][j]%9973; ans.m[i][j]%=9973; } } } return ans; } int main() { int n,t; long long k; matrix ans,y; //freopen("in.txt","r",stdin); while(~scanf("%d",&t)) { while(t--) { scanf("%d %lld",&n,&k); for(int i=0;i<n;++i) for(int j=0;j<n;++j) { ans.m[i][j]=(i==j?1:0); scanf("%d",&y.m[i][j]); } while(k!=0) {//将k转为2进制,从最低位开始算起 if(k%2==1)//二进制该位为1,则累乘至ans { ans=mul(ans,y,n); } k/=2;//右移1位 y=mul(y,y,n);//计算下一位的权值 } int sum=0; for(int i=0;i<n;++i) { sum+=ans.m[i][i]; sum%=9973; } printf("%d\n",sum); } } return 0; }