一道关于矩阵快速幂的题目
思路见代码注释
#include<iostream>
#include<cstring>
using namespace std;
#define N 100 //N达到1000程序就会崩溃
#define Mod 9973
int n,i,j,k1,k;
typedef struct //用结构体表示矩阵比二维数组要方便
{
int a[N][N];
}Matrix;
Matrix mult(Matrix m1,Matrix m2) //定义矩阵乘法
{
Matrix m;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
m.a[i][j]=0; //初始化
for(k1=0;k1<n;k1++)
{
m.a[i][j]+=m1.a[i][k1]*m2.a[k1][j]%Mod;
m.a[i][j]%=Mod;
}
}
return m;
}
long long pow_mod3(Matrix m)
{
Matrix ans;
//构造单位矩阵
for(i=0;i<n;i++)
for(j=0;j<n;j++)
ans.a[i][j]=0;
for(i=0;i<n;i++)
ans.a[i][i]=1;
//矩阵快速幂
while(k)
{
if(k&1) ans=mult(ans,m);
m=mult(m,m);
k=k>>1;
}
//计算对角线之和
long long sum=0;
for(i=0;i<n;i++)
sum=(sum+ans.a[i][i])%Mod;
return sum;
return 0;
}
int main()
{
int t;
Matrix M;
cin>>t;
while(t--)
{
cin>>n>>k;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
cin>>M.a[i][j];
cout<<pow_mod3(M)<<endl;
}
return 0;
}