输入一个矩阵,求他的k次幂,最后得到的矩阵对角线上相加即可
由于数据很大,要用矩阵的快速幂
知道了矩阵的快速幂,直接套用模板就可以
不知道的话,看我hdu1757有简单介绍
#include <iostream>
using namespace std;
int n,k,mod=9973;
struct matrix
{
int m[15][15];
};
matrix x,y;
matrix operator*(matrix a,matrix b)
{
matrix c;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
c.m[i][j] = 0;
for(int K=0;K<n;K++){
c.m[i][j]+=(a.m[i][K]*b.m[K][j])%mod;
}
c.m[i][j]%=mod;
}
}
return c;
}
matrix Pow(matrix a,matrix b,int c)
{
while(c){
if(c&1){
b = a*b;
}
a = a*a;
c>>=1;
}
return b;
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n>>k;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{cin>>x.m[i][j];y.m[i][j]=x.m[i][j];}
matrix z=Pow(x,y,k-1);
int sum=0;
for(int i=0;i<n;i++)
sum=(sum+z.m[i][i])%mod;
cout<<sum%mod<<endl;
}
return 0;
}