题目中所给的方阵就是一个矩阵,而就是只要将题目所给矩阵不断进行相乘即可,本题中我采用的是直接重载运算符*,使矩阵每一个都进行运算,可以简化为只对对角线上的元素进行运算。最后所得结果就只需将最终的矩阵上的对角线上的数相加即可。快速幂即是将指数进行质因子分解,从而减少运算,比如15=7*2+1,而7=3*2+1,3=2*1+1,如此便只需3步即可求出15。
代码如下:
#include<cstdio> #include<cstring> using namespace std; const int maxn=10; struct Matrix { long long mat[maxn][maxn]; Matrix operator*(const Matrix& m)const///重载*运算符,使其能进行矩阵相乘的运算 { Matrix tmp; for(int i = 0 ; i < maxn ; i++) { for(int j = 0 ; j < maxn ; j++) { tmp.mat[i][j] = 0; for(int k = 0 ; k < maxn ; k++) { tmp.mat[i][j] += mat[i][k]*m.mat[k][j]; tmp.mat[i][j] %= 9973; } } } return tmp; } }; long long PowerMod(Matrix a, long long b,int n) { long long sum=0; Matrix ans; memset(ans.mat,0,sizeof(ans.mat)); for(int i=0;i<n;i++) ans.mat[i][i]=1; while(b) { if(b&1) ans=ans*a; b>>=1; a=a*a; } for(int i=0;i<n;i++) { sum+=ans.mat[i][i]; sum%=9973; } return sum; } int main() { int n,t; long long k; while(~scanf("%d",&t)) { while(t--) { Matrix input; memset(input.mat,0,sizeof(input.mat)); scanf("%d%lld",&n,&k); for(int i=0; i<n; i++) for(int j=0; j<n; j++) scanf("%d",&input.mat[i][j]); printf("%lld\n",PowerMod(input, k,n)); } } return 0; }
浙公网安备 33010602011771号