http://acm.hdu.edu.cn/showproblem.php?pid=1575
矩阵+快速幂
A^k是A*A*A...(k个A相乘)
View Code
#include <iostream> using namespace std ; void mul(int a[11][11],int b[11][11],int n) { int c[11][11] ; int i,j,k ; for(i=0;i<n;i++) for(j=0;j<n;j++) c[i][j]=0 ; for(i=0;i<n;i++) for(j=0;j<n;j++) for(k=0;k<n;k++) c[i][j]=(c[i][j]+a[i][k]*b[k][j])%9973 ; for(i=0;i<n;i++) for(j=0;j<n;j++) a[i][j]=c[i][j] ; } void qpow(int m[11][11],__int64 k,int n) { int ans[11][11] ; int buff[11][11] ; int i,j ; for(i=0;i<n;i++) for(j=0;j<n;j++) if(i==j) ans[i][j]=1 ; else ans[i][j]=0 ; for(i=0;i<n;i++) for(j=0;j<n;j++) buff[i][j]=m[i][j] ; while(k) { if(k&1) mul(ans,buff,n) ; mul(buff,buff,n) ; k>>=1 ; } for(i=0;i<n;i++) for(j=0;j<n;j++) m[i][j]=ans[i][j] ; } int main() { int t ; int m[11][11] ; scanf("%d",&t) ; while(t--) { int n ; __int64 k ; scanf("%d%I64d",&n,&k) ; for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%d",&m[i][j]) ; qpow(m,k,n) ; int ans=0 ; for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(i==j) ans=(ans+m[i][j])%9973 ; printf("%d\n",ans) ; } return 0 ; }