Tr A
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4980 Accepted Submission(s): 3716
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的内容。
每组数据的第一行有n(2 <= n <= 10)和k(2 <= k < 10^9)两个数据。接下来有n行,每行有n个数据,每个数据的范围是[0,9],表示方阵A的内容。
Output
对应每组数据,输出Tr(A^k)%9973。
Sample Input
2
2 2
1 0
0 1
3 99999999
1 2 3
4 5 6
7 8 9
Sample Output
2
2686
Author
xhd
Source
Recommend
其实和普通快速幂思想一致,不过相乘的是矩阵要做处理。、
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N = 11; const int MOD = 9973; int n; struct Matrix{ int mat[N][N]; }; Matrix operator * (Matrix a, Matrix b) { Matrix c; memset(c.mat, 0, sizeof(c.mat)); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ for(int k=0;k<n;k++){ c.mat[i][j] += a.mat[i][k] * b.mat[k][j]; } c.mat[i][j] %= MOD; } } return c; } Matrix operator ^ (Matrix a, int k) { Matrix c; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ c.mat[i][j] = (i==j); } } while(k){ if(k&1){ c=c*a; } a=a*a; k>>=1; } return c; } int getTr(Matrix a){ int sum=0; for(int i=0;i<n;i++){ sum+=a.mat[i][i]; sum%=MOD; } return sum; } int main() { int t; scanf("%d",&t); while(t--){ int k; scanf("%d%d", &n, &k); Matrix m; for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%d",&m.mat[i][j]); m = m^k; printf("%d ",getTr(m)); } return 0; }