Tr A
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5366 Accepted Submission(s): 4024
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
矩阵快速幂的模板题
#include<iostream> #include<cstdio> #include<cstring> #define mod 9973 #define maxn 12 using namespace std; struct mat{ int s[maxn][maxn],n; mat (int n1){//构造器 n = n1; memset(s,0,sizeof(s));//一定要初始化 } void init(){ for(int i=1;i<=n;i++){//单位矩阵的初始化,切记! s[i][i] = 1;//如果没有这个的话就不能直接相乘 } } mat operator * (const mat m){ mat ans(this->n);//理解this的用法 for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ for(int k=1;k<=n;k++){ ans.s[i][j] = (ans.s[i][j] + this->s[i][k] * m.s[k][j])%mod; } } } return ans; } }; mat quick_mod(mat &m,int p){//和整数快速幂一样的方法,只不过这里面的乘是矩阵的相乘 mat ans(m.n); ans.init();// ans一定要为单位矩阵的! while(p){ if(p&1){ ans = ans * m; } m = m*m; p >>= 1; } return ans; } int main() { int t,n,k; cin >> t; while(t--){ cin >> n >> k; mat m(n); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cin >> m.s[i][j]; } } mat ans(n); ans = quick_mod(m,k); int sum = 0; for(int i=1;i<=n;i++){ sum = (sum+ans.s[i][i])%mod; } cout << sum << endl; } return 0; }