HDU1575:裸的矩阵快速幂(二进制迭代法),用结构体能省不少事,想的话也可以重载个乘法
#include<cstdio> #include<iostream> #define N 11 using namespace std; const int mod=9973; int n; struct matrix { int i,j; int a[N][N]; void init() { for(i=0;i<N;i++) for(j=0;j<N;j++) a[i][j]=(i==j)?1:0; } }; matrix matrixmult(matrix a,matrix b)//矩阵相乘 { matrix c; int i,j,k; for(i=0;i<n;i++) for(j=0;j<n;j++) { c.a[i][j]=0; for(k=0;k<n;k++) c.a[i][j]+=((a.a[i][k]*b.a[k][j])%mod); c.a[i][j]%=mod; } return c; } matrix lm(matrix a,int k)//快速幂 { matrix ans; ans.init(); while(k>0) { if(k&1) ans=matrixmult(a,ans); k>>=1; a=matrixmult(a,a); } return ans; } int main() { int t,k,i,j; matrix s; while(~scanf("%d",&t)) { while(t--) { int sum=0; cin>>n>>k; for(i=0;i<n;i++) for(j=0;j<n;j++) scanf("%d",&s.a[i][j]); s=lm(s,k); for(i=0;i<n;i++) sum+=s.a[i][i]; sum%=mod; cout<<sum<<endl; } } return 0; }