利用快速幂的思想 根据矩阵的结合律 可以递归二分求解
struct Mat { int mat[N][N]; }; int n; Mat operator * (Mat a,Mat b) { Mat c; memset(c.mat,0,sizeof(c.mat)); int i,j,k; for(k =0 ; k < n ; k++) { for(i = 0 ; i < n ;i++) { if(a.mat[i][k]==0) continue;//优化 for(j = 0 ;j < n ;j++) { if(b.mat[k][j]==0) continue;//优化 c.mat[i][j] = (c.mat[i][j]+(a.mat[i][k]*b.mat[k][j])%mod)%mod; } } } return c; } Mat operator ^(Mat a,int k) { Mat c; int i,j; for(i =0 ; i < n ;i++) for(j = 0; j < n ;j++) c.mat[i][j] = (i==j); for(; k ;k >>= 1) { if(k&1) c = c*a; a = a*a; } return c; }