http://acm.hdu.edu.cn/showproblem.php?pid=1575
矩阵声明
struct matrix{
int map[12][12];
};
矩阵乘法
matrix multiplication(matrix a, matrix b){
matrix c;
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
c.map[i][j] = 0;
for(int k=0; k<n; k++)
c.map[i][j] += (a.map[i][k] * b.map[k][j]);
c.map[i][j] %= 9973;
}
}
return c;
}
快速幂求解矩阵的幂
matrix quickpow(int x){///u是单位矩阵
matrix p = u , q = m;
while(x >= 1){
if(x & 1) p = multiplication(p,q);
x >>= 1;
q = multiplication(q,q);
}
return p;
}
AC_CODE:
#include <stack>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int n,k;
struct matrix{
int map[12][12];
}m,u;
matrix multiplication(matrix a, matrix b){
matrix c;
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
c.map[i][j] = 0;
for(int k=0; k<n; k++)
c.map[i][j] += (a.map[i][k] * b.map[k][j]);
c.map[i][j] %= 9973;
}
}
return c;
}
matrix quickpow(int x){
matrix p = u , q = m;
while(x >= 1){
if(x & 1) p = multiplication(p,q);
x >>= 1;
q = multiplication(q,q);
}
return p;
}
int main(){
// freopen("in.txt", "r", stdin);
int cas;
scanf("%d",&cas);
while(cas--){
scanf("%d%d",&n,&k);
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
cin >> m.map[i][j];
if(i == j) u.map[i][j] = 1;
else u.map[i][j] = 0;
}
}
matrix res = quickpow(k);
int sum = 0;
for(int i=0; i<n; i++){
sum += res.map[i][i];
sum %= 9973;
}
printf("%d\n",sum);
}
return 0;
}