本题的考点有俩:1.矩阵乘法;2.二分求幂。
由于矩阵乘法也满足结合律,故只要定义好矩阵乘法的函数(或可用运算符重载),剩下的思想基本与实数的二分求幂无异。
-
题目地址:点击打开链接
题目描述:
-
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>
using namespace std;
bool mtp(int pro[10][10],int matrix[10][10],int n);
int temp[10][10];
int main(){
int T,n,k;//TΪÊý¾Ý×éÊý£¬nΪ·½Õó¹æÄ££¬kΪÃÝ´Î
int matrix[10][10];
int pro[10][10];
int weight[10][10];
int tr;
while (cin>>T){
for (int time=0;time<T;time++){
cin>>n>>k;
//input
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
cin>>matrix[i][j];
}
}
//initiate
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
if (i==j)
pro[i][j]=1;
else
pro[i][j]=0;
}
}
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
weight[i][j]=matrix[i][j];
}
}
tr=0;
//calculate
while (k>0){
if (k%2==1){
//pro*=weight;
mtp(pro,weight,n);
}
//k/=2,weight*=weight;
k/=2;
mtp(weight,weight,n);
}
for (int i=0;i<n;i++){
tr+=pro[i][i];
}
tr%=9973;
//output
cout<<tr<<endl;
}
}
return true;
}
bool mtp(int pro[10][10],int matrix[10][10],int n){//pro*matrix,½á¹û´æ´¢ÔÚpro
for (int i=0;i<n;i++){//initiate temp
for (int j=0;j<n;j++){
temp[i][j]=0;
}
}
for (int i=0;i<n;i++){//ÇóµÄÐÐÊý
for (int j=0;j<n;j++){//ÇóµÄÁÐÊý
for (int p=0;p<n;p++){//pΪ×߶¯µÄÓαê
temp[i][j]+=(pro[i][p]%9973)*(matrix[p][j]%9973);
temp[i][j]%=9973;
}
}
}
for (int i=0;i<n;i++){//½«temp¸´Öƽøpro
for (int j=0;j<n;j++){
pro[i][j]=temp[i][j];
}
}
return true;
}