http://acm.hdu.edu.cn/showproblem.php?pid=1575
思路:这题求的是矩阵A^k,可以用矩阵相乘的方法,设a=1,b=0,然后把k进行分解,当k为奇数是,k--,b+=a,当k为偶数是k/=2,a=2*a,最后再将a=a+b.
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
int m;
long long int n;
struct node
{
int a[15][15];
};
node fix(node a,node b)
{
int i,j,k;
node c;
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
{
c.a[i][j]=0;
for(k=0;k<m;k++)
{
c.a[i][j]+=a.a[i][k]*b.a[k][j];
}
c.a[i][j]%=9973;
}
}
return c;
}
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>m>>n;
int i,j;
node a,b;
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
{
cin>>a.a[i][j];
if(i==j)
b.a[i][j]=1;
else b.a[i][j]=0;
}
}
while(n>1)
{
if(n%2==1)
{
n--;
b=fix(a,b);
}
else
{
n/=2;
a=fix(a,a);
}
}
long long int sum=0;
a=fix(a,b);
for(i=0;i<m;i++)
sum+=a.a[i][i];
cout<<sum%9973<<endl;
}
return 0;
}