struct Matrix { LL mat[MAXN][MAXN]; int r; void init(int n) { memset(mat,0,sizeof(mat)); r=n; } }; Matrix matrix_mul(Matrix a,Matrix b) { Matrix ans; ans.init(a.r); for(int i=0;i<a.r;i++) for(int j=0;j<a.r;j++) for(int k=0;k<a.r;k++) ans.mat[i][j]+=a.mat[i][k]*b.mat[k][j]; return ans; } Matrix maxtrix_pow(Matrix a,LL n,int r) { Matrix ans; ans.initr(r); for(int i=0;i<r;i++) ans.mat[i][i]=1; while(n) { if(n&1) ans=matrix_mul(ans,a); n>>=1; a=matrix_mul(a,a); } return ans; }