矩阵快速幂取模
一定要每一步都取模!否则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;
}