class Matrix { public: int r, c; ll mat[32][32]; ll *operator [] (int x) { return mat[x]; } Matrix operator * (const Matrix &a) const { Matrix res; res.r = r; res.c = a.c; int i, j, k; for (i=1; i<=res.r; ++i) { for (j=1; j<=res.c; ++j) { res[i][j] = 0; for (k=1; k<=c; ++k) res[i][j] += mat[i][k] * a.mat[k][j]; } } return res; } }m; Matrix pwr(const Matrix &a, int k) { Matrix base = a, r; int i, j; r.r = a.r; r.c = a.c; for (i=1; i<=r.r; ++i) for (j=1; j<=r.c; ++j) r[i][j] = i==j; while (k) { if (k & 1) r = r * base; base = base * base; k >>= 1; } return r; }