struct Matrix { int h,w; long long mx[MAXS][MAXS]; Matrix() { h=0; w=0; memset(mx,0,sizeof(mx)); } Matrix operator* (const Matrix& b) const { Matrix tmp; memset(tmp.mx,0,sizeof(tmp.mx)); tmp.h=h; tmp.w=b.w; for (int i=0; i<h; i++) { for (int j=0; j<b.w; j++) { for (int k=0; k<w; k++) { tmp.mx[i][j]=(tmp.mx[i][j]+(mx[i][k]*b.mx[k][j])%MOD)%MOD; } } } return tmp; } void initE() { memset(mx,0, sizeof(mx)); for (int i=0 ; i<w ; i++) { mx[i][i]=1LL; } } Matrix mpow(long long k) { Matrix c,b; c=(*this); memset(b.mx,0,sizeof(b.mx)); b.w=w; b.h=h; b.initE(); while(k) { if(k&1LL) { b=b*c; } c=c*c; k>>=1LL; } return b; } };