http://acm.hdu.edu.cn/showproblem.php?pid=1575
#include<iostream>//典型的矩阵二分,只要记住模板,稍微修改就OK了
#include<cstdio>
#include<string>
using namespace std;
int MAX;
const int mod = 9973;
struct Mat
{
int df[11][11];
}init, unit;
Mat Mul(Mat a,Mat b)
{
int i, j, k;
Mat c;
for(i = 0; i < MAX; i++)
for(j = 0; j < MAX; j++)
{
c.df[i][j] = 0;
for(k = 0; k < MAX; k++)
c.df[i][j] += a.df[i][k] * b.df[k][j];
if(c.df[i][j] >= mod)
c.df[i][j] %= mod;
}
return c;
}
Mat cal(int t)
{
Mat p, q;
p = init;
q = unit;
while(t != 1)
{
if(t&1)
{
p = Mul(p, q);
t--;
}
else
{
q = Mul(q, q);
t >>= 1;
}
}
p = Mul(p, q);
return p;
}
int main()
{
int i, j, k, sum, t;
Mat tt;
scanf("%d", &t);
while(t--)
{
scanf("%d%d",&MAX, &k);
//memset(unit,0,sizeof(unit));
memset(unit.df,0,sizeof(unit.df));
memset(init.df,0,sizeof(init.df));
for(i = 0; i < MAX; i++)
for(j = 0; j < MAX; j++)
{
scanf("%d",&unit.df[i][j]);
init.df[i][i] = 1;
}
tt = cal(k);
sum = 0;
for(i = 0; i < MAX ; i++)
for(j = 0; j < MAX; j++)
if(i == j)
sum += tt.df[i][j] % mod;
printf("%d/n", sum % mod);
}
return 0;
}