题目1443:Tr A
时间限制:1 秒
内存限制:128 兆
特殊判题:否
提交:173
解决:102
-
题目描述:
-
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> #include<stdio.h> #include<string.h> #define mod 9973 using namespace std; int sum[11][11]; int s[11][11]; int m;
//矩阵乘法 void matrix(int p[][11],int q[][11]) { int c[11][11]={0}; for(int i=1;i<=m;i++) { for(int j=1;j<=m;j++) { for(int k=1;k<=m;k++) { c[i][j]+=p[i][k]*q[k][j]; } } } for(int i=1;i<=m;i++) for(int j=1;j<=m;j++) p[i][j]=c[i][j]%mod; }
//二分求幂 int quickbir(int k) { memset(sum,0,sizeof(sum)); for(int i=1;i<=m;i++) sum[i][i]=1; while(k!=0) { if(k&1) { matrix(sum,s); } matrix(s,s); k>>=1; } int ans=0; for(int i=1;i<=m;++i)ans=(ans+sum[i][i])%mod;//求对角线和 return ans; } int main() { int n; freopen("in.txt","r",stdin); scanf("%d",&n); while(n--!=0) { int res=0; int k; scanf("%d%d",&m,&k); for(int i=1;i<=m;i++) { for(int j=1;j<=m;j++) scanf("%d",&s[i][j]); } res=quickbir(k); printf("%d\n",res); } return 0; }