形式和数的快速幂是一致的,不过要定义struct的运算符
在矩阵的乘法运算中进行取模
#include<iostream> #include<algorithm> #include<math.h> #include<stdio.h> #include<string.h> #include<stdlib.h> #include<stack> #include<queue> #define forp(i,n) for(int i=1;i<=n;i++) #define ptf(i) printf("%d\n",i) #define scf(i) scanf("%d",&i) const int MOD = 9973; const int MAXN = 13; typedef long long LL; void init() { } int T, n; struct Mat{ int mat[MAXN][MAXN]; }; Mat operator * (Mat a, Mat b); Mat operator ^ (Mat a, int k); int main() { init(); Mat m; int k, ans; scanf("%d",&T); while(T--){ ans=0; scf(n);scf(k); forp(i,n) forp(j,n) scf(m.mat[i][j]); m=m^k; forp(i,n) ans=(ans+m.mat[i][i])%MOD; printf("%d\n",ans); } return 0; } Mat operator * (Mat a, Mat b){ Mat c; forp(i,n) forp(j,n) c.mat[i][j]=0; forp(i,n) forp(j,n) forp(k,n) c.mat[i][j]=(c.mat[i][j]+a.mat[i][k]*b.mat[k][j])%MOD; return c; } Mat operator ^ (Mat a, int k){ Mat c; forp(i,n) forp(j,n) c.mat[i][j]=(i==j); while(k){ if(k&1) c=c*a; a=a*a; k>>=1; } return c; }
时间: 2024-10-12 17:55:32