矩阵快速幂——将运算推广到矩阵上HDU 1575
/*
本题的思路比较简单,就是将递推公式写出来,然后表达成为一个矩阵的形式
最后通过计算就可以得到一个符合题目要求的矩阵,
然后就是将矩阵上面所有的对角线元素相加
得到的结果即为所求的目标
*/
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 15;
#define mod 9973
int res[maxn][maxn];
int n;
void mul(int a[][15],int b[][15],int c[][15]){
int temp[15][15]; memset(temp,0,sizeof(temp));
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
for(int k=0;k<n;k++){
temp[i][j]=(temp[i][j]+ a[i][k]*b[k][j] )%mod;
}
memcpy(c,temp,sizeof(temp));
}
void pow(int a[][15],int k){
while(k){
if(k&1){
mul(res,a,res);
}
mul(a,a,a);
k>>=1;
// printf("%d\n",k);
}
}
int main(){
int T,k;
int a[maxn][maxn];
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++) for(int j=0;j<n;j++) res[i][j]=(i==j);
//这个做法主要是将对角线标记出来,然后就可以与矩阵a相乘,最后得到的a矩阵就是一个对角矩阵
for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%d",&a[i][j]);
pow(a,k);
int ans=0;
for(int i=0;i<n;i++) ans+=res[i][i];
printf("%d\n",ans%mod);
}
return 0;
}
//自己现在最大的问题就是知道矩阵相乘的方法,但是将一个数组的问题处理好就没办法了……
////////////////////////////////////////////////////////////////////////////////////////////////////////////
矩阵方面的问题处理参考方式
矩阵乘法
struct Matrix{
long long mat[N][N];
Matrix operator*(const Matrix m)const{
Matrix tmp;
for(int i = 0;i < n;i++){
for(int j = 0;j < n;j++){
tmp.mat[i][j] = 0;//完成初始化
for(int k = 0;k < n;k++){
tmp.mat[i][j] += mat[i][k]*m.mat[k][j]%MOD;
tmp.mat[i][j] %= MOD;
}}}
return tmp;
//这个是通过new一个空间后达到目的的,所以后面会有空间的保留,可以通过这种方式将数组传递下来
}
};