2 2 2 1 0 0 1 3 99999999 1 2 3 4 5 6 7 8 9
2 2686
#include <stdio.h>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <map>
#include <vector>
using namespace std;
__int64 n;
struct node
{
__int64 a[15][15];
};
node mut_mut(node e,node d) //两个矩阵相乘
{
__int64 i,j,k;
node m;
memset(m.a,0,sizeof(m.a));
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
for(k=1; k<=n; k++)
{
m.a[i][j]+=e.a[i][k]*d.a[k][j];
m.a[i][j]%=9973;
}
return m;
}
node fastmi(node a1,__int64 cishu) //快速幂
{
__int64 i;
node f;
memset(f.a,0,sizeof(f.a));
for(i=1; i<=n; i++)
f.a[i][i]=1;
while(cishu)
{
if(cishu&1)
f=mut_mut(f,a1);
a1=mut_mut(a1,a1);
cishu>>=1;
}
return f;
}
int main()
{
__int64 i,j,t,cishu;
node c,last;
scanf("%I64d",&t);
while(t--)
{
scanf("%I64d%I64d",&n,&cishu);
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
{
scanf("%I64d",&c.a[i][j]);
c.a[i][j]%=9973;
}
last=fastmi(c,cishu);
__int64 sum=0;
for(i=1; i<=n; i++)
{
sum+=last.a[i][i];
sum%=9973;
}
printf("%I64d\n",sum);
memset(last.a,0,sizeof(last.a));
}
return 0;
}
原文:http://blog.csdn.net/sky_miange/article/details/44601429