题目描述:
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<cstdio>
#include<math.h>
#include<string.h>
#define M 9973
#define H 102
using namespace std;
typedef struct Matrix{
int v[H][H];
} matrix;
//Matrix E;
//Matrix Ans;
Matrix Mul(Matrix aa,Matrix bb,int n){
// cout<<"get in now"<<endl;
Matrix cc;
memset(cc.v,0,sizeof(cc.v)); //将所有的v置0
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
for(int c=0;c<n;c++){
cc.v[i][j]+=aa.v[i][c]*bb.v[c][j];
cc.v[i][j]%=M;
}
}
}
return cc;
}
Matrix pow(Matrix E,int k,int n){ //求x^y x可能是longlong E(n)^k 910^9==10^10 <21亿
Matrix Ans;
memset(Ans.v,0,sizeof(Ans.v));
for(int i=0;i<n;i++){
Ans.v[i][i]=1;
}
while(k!=0){
if(k%2==1){
Ans=Mul(E,Ans,n);
}
k/=2;
E=Mul(E,E,n);
}
return Ans;
}
int main(){
int t,n;
int k;
Matrix E;
Matrix Ans;
cin>>t;
for(int j=0;j<t;j++){
cin>>n>>k;
for(int a=0;a<n;a++){
for(int b=0;b<n;b++){
cin>>E.v[a][b];
E.v[a][b]%=M;
}
}
//矩阵输入完毕;
Ans=pow(E,k,n);
int count=0;
for(int p=0;p<n;p++){
count=count + Ans.v[p][p];
count%=M;
}
cout<<count<<endl;
}
return 0;
}
/**************************************************************
Problem: 1443
User: WZDCJ0206
Language: C++
Result: Accepted
Time:20 ms
Memory:1688 kb
****************************************************************/