hdu1575(矩阵快速幂入门题)
题目链接
struct mat{ int m[maxn][maxn]; }unit;//矩阵的数据结构
**重载矩阵*强调内容*乘法** mat operator * (mat a,mat b) { mat ret; ll x; for(int i=0;i<n;i++) for(int j=0;j<n;j++) { x=0; for(int k=0;k<n;k++) x+=mod((ll)a.m[i][k]*b.m[k][j]); ret.m[i][j]=mod(x); } return ret; }
#include<iostream> #include<algorithm> using namespace std; #define mod(x) ((x)%9973) typedef long long ll; const int maxn =11; int n; struct mat{ int m[maxn][maxn]; }unit; //矩阵乘法 mat operator * (mat a,mat b) { mat ret; ll x; for(int i=0;i<n;i++) for(int j=0;j<n;j++) { x=0; for(int k=0;k<n;k++) x+=mod((ll)a.m[i][k]*b.m[k][j]); ret.m[i][j]=mod(x); } return ret; } void init_unit() { for(int i=0;i<maxn;i++) unit.m[i][i]=1; return ; } mat pow_mat(mat a,ll n) { mat ret=unit; while(n) { if(n&1) { ret= ret*a; } n>>=1; a=a*a; } return ret; } int main() { ios::sync_with_stdio(false); int x; int T; cin>>T; init_unit(); while(T--&&cin>>n>>x) { mat a; for(int i=0;i<n;i++) for(int j=0;j<n;j++) cin>>a.m[i][j]; a=pow_mat(a,x); ll ans=0; for(int i=0;i<n;i++) ans+=a.m[i][i]; ans%=9973; cout<<ans<<endl; } return 0; }