矩阵快速幂与正常的整数快速幂完全一致,只不过重定义了一下乘号罢了。
但注意此代码下的ans应初始化为矩阵乘法的幺元——即单位矩阵。
联动#F.Tr A
#include<bits/stdc++.h> using namespace std; int n, moyn = 9973, t, s; struct matrix{ long long mat[10][10]; matrix() {memset(mat,0,sizeof(mat));} matrix operator *(const matrix& T) const { matrix res; int tmp; for(int i = 0;i < 10;++i) { for(int k = 0;k < 10;++k) { tmp = mat[i][k]; for(int j = 0;j < 10;++j) { res.mat[i][j] += tmp*T.mat[k][j]; res.mat[i][j] %= moyn; } } } return res; } } ans, base; void init() { memset(ans.mat,0,sizeof(ans.mat)); for(int i = 0;i < 10;++i) ans.mat[i][i] = 1; memset(base.mat,0,sizeof(base.mat)); return; } void quickpow(int x) { while(x) { if(x&1) ans = ans*base; base = base*base; x >>= 1; } return; } int main() { scanf("%d",&t); for(int i = 1;i <= t;++i) { scanf("%d %d",&n,&s); init(); for(int j = 0;j < n;++j) for(int k = 0;k < n;++k) scanf("%lld",&base.mat[j][k]); quickpow(s); int res = 0; for(int i = 0;i < 10;++i) { res += ans.mat[i][i]; res %= moyn; } printf("%d\n",res); } return 0; }