矩阵快速幂取模
一定要每一步都取模!否则WA.
#include <cstdio> #include <cstring> using namespace std; int x,n,k,mod=9973; struct Matrix { int pos[11][11]; friend Matrix operator*(Matrix a,Matrix b) { Matrix c; memset(c.pos,0,sizeof(c.pos)); for(int i=0;i<n;i++) for(int j=0;j<n;j++) { for(int k=0;k<n;k++) { c.pos[i][j]+=(a.pos[i][k]*b.pos[k][j])%mod; } c.pos[i][j]%=mod; } return c; } }matrix; /*void debug(Matrix a) { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) printf("%d\t",a.pos[j][i]); puts(""); } puts(""); }*/ int tr(Matrix tmp) { //debug(tmp); Matrix res; memset(res.pos,0,sizeof(res.pos)); for(int i=0;i<n;i++) res.pos[i][i]=1; for(int i=0;k>>i;i++) { int num=k>>i; if(num&1) res=res*tmp; tmp=tmp*tmp; } int cnt=0; for(int i=0;i<n;i++) cnt=(cnt+res.pos[i][i])%mod; //printf("cnt:%d\n",cnt); return cnt; } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&k); for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%d",&matrix.pos[i][j]); //debug(matrix); printf("%d\n",tr(matrix)%mod); } return 0; }