1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
   | struct Matrix {     int n, m, rec[N][N];              Matrix(int _n, int _m) { n = _n, m = _m, memset(rec, 0, sizeof rec); }         void reset() { n = 0, m = 0, memset(rec, 0, sizeof rec); }          int* operator [] (int i) { return rec[i]; }         const int* operator [] (int i) const { return rec[i]; }    
      friend Matrix operator * (const Matrix &a, const Matrix &b)         {         Matrix res(a.n, b.m);         for (int k = 0; k < a.m; k ++)             for (int i = 0; i < res.n; i ++)                 for (int j = 0; j < res.m; j ++)                     res[i][j] = (res[i][j] + a[i][k] * b[k][j]) % mod;         return res;     }          friend Matrix operator ^ (Matrix A, int k)       {         Matrix res(A.n, A.m);         for (int i = 0; i < res.n; i ++) res[i][i] = 1;         while (k)         {             if (k & 1) res = res * A;             A = A * A, k >>= 1;         }         return res;     } };
   |