题目大意:给定一个矩阵A,给定一个幂次k,计算出矩阵A的k次幂,然后计算出对角线之和sum,再对sum取模(mod)。写一个Multi函数计算矩阵的k次幂,写一个Power函数利用矩阵快速幂来计算。
此题可作为模板。
代码实现:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#define M 16
#define Mod 9973
using namespace std;
int n;
struct Matrix
{
int val[M][M];
}a, per;
Matrix Multi(Matrix x, Matrix y)
{
Matrix z;
for(int i =0; i<n; i++){
for(int j =0; j<n; j++){
z.val[i][j] = 0;
for(int k =0; k<n; k++){
z.val[i][j] = z.val[i][j] + (x.val[i][k]*y.val[k][j])%Mod;
}
z.val[i][j] %= Mod;
}
}
return z;
}
int Power(int k)
{
Matrix p = a;
Matrix res = per;
int sum = 0;
while(k){
if(k & 1) res = Multi(res, p);//相当于if(k%2==1) 将k转换为二进制,只要最右端为1,该语句为真
k /= 2;
p = Multi(p, p);
}
for(int i =0; i<n; i++){
sum = (sum + res.val[i][i])%Mod;
}
return sum;
}
int main()
{
int t, k;
scanf("%d", &t);
while(t--){
scanf("%d%d", &n, &k);
for(int i =0; i<n; i++){
for(int j=0; j<n; j++){
scanf("%d", &a.val[i][j]);
a.val[i][j] = a.val[i][j]%Mod;
per.val[i][j] = (i==j)?1: 0;
}
}
int ans = Power(k);
printf("%d\n", ans);
}
return 0;
}