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
浙公网安备 33010602011771号