套矩阵快速幂模版,中间步骤及时mod即可
/*************************************************************************
> File Name: HDU1575.CPP
> Author: Xingxing
> Created Time: 2016/9/19 23:30:31
************************************************************************/
#include <iostream>
#include <cstdio>
#include <cstring>
const int mod=9973;
const int N=10;
int n,k;
using namespace std;
struct mat{
int m[N][N];
mat() {}
mat unit()
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
m[i][j]=i==j?1:0;
}
};
mat operator * (mat a,mat b){
mat res;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
res.m[i][j]=0;
for(int k=0;k<n;k++)
res.m[i][j]+=(a.m[i][k]%mod)*(b.m[k][j]%mod)%mod;
}
return res;
}
mat t;
mat operator ^ (mat res,int m){
res.unit();
while(m>=1){
if(m&1)
res=res*t;
m=m>>1;
t=t*t;
}
return res;
}
int main(){
//freopen("input.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--){
memset(t.m,0,sizeof(t.m));
mat A;
int sum=0;
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&t.m[i][j]);
A=t^(k);
/*for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
printf("%d ",t.m[i][j]);
cout<<endl;
}*/
for(int i=0;i<n;i++)
sum+=A.m[i][i]%mod;
sum%=mod;
printf("%d\n",sum);
}
return 0;
}

本文介绍了一种利用矩阵快速幂解决大规模线性递推问题的方法。通过定义特定的矩阵并运用快速幂运算,可以在对数时间内高效求解递推序列的第k项,适用于竞赛编程中的动态规划题目。
1991

被折叠的 条评论
为什么被折叠?



