hdu1575 Tr A 矩阵快速幂模板题

hdu1575   TrA

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1575

都不需要构造矩阵,矩阵是题目给的,直接套模板,把对角线上的数相加就好了,记得取膜就好了。

//Author: xiaowuga
#include <bits/stdc++.h>
#define maxx INT_MAX
#define minn INT_MIN
#define inf 0x3f3f3f3f
#define maxn 12
#define MOD 9973
using namespace std;
typedef long long ll;
ll n,k;
struct Matrix{
    ll mat[15][15];
    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;
    }
};
ll POW(Matrix &m,int k){
    Matrix ans;
    memset(ans.mat,0,sizeof(ans.mat));
    for(int i=0;i<n;i++) ans.mat[i][i]=1;
    while(k){
        if(k&1) ans=ans*m;
        k/=2;
        m=m*m;
    }
    ll sum=0;
    for(int i=0;i<n;i++){
        sum+=ans.mat[i][i];
        sum%=MOD;
    }
    return sum;
}
int main() {
    ios::sync_with_stdio(false);cin.tie(0);
    int T;
    cin>>T;
   while(T--){
      cin>>n>>k;
      Matrix m;
      for(int i=0;i<n;i++)
          for(int j=0;j<n;j++) cin>>m.mat[i][j];
      cout<<POW(m,k)<<endl;
   }         
    return 0;
}
原文地址:https://www.cnblogs.com/xiaowuga/p/7169529.html