矩阵快速幂——将运算推广到矩阵上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一个空间后达到目的的,所以后面会有空间的保留,可以通过这种方式将数组传递下来
    }
};
 
                     
                    
                 
                    
                 
 
         
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号