#include using namespace std; template vector> matrix_unit(int n) { vector> res(n, vector(n)); for (int i = 0; i < n; i++) res[i][i] = 1; return res; } template vector> &operator+=(vector> &a, const vector> &b) { for (size_t i = 0; i < a.size(); i++) for (size_t j = 0; j < a[0].size(); j++) a[i][j] += b[i][j]; return a; } template vector> operator+(vector> a, const vector> &b) { a += b; return a; } template vector> operator*(const vector> &a, const vector> &b) { int n = a.size(); int m = a[0].size(); int k = b[0].size(); vector> res(n, vector(k)); for (int i = 0; i < n; i++) for (int j = 0; j < k; j++) for (int p = 0; p < m; p++) res[i][j] += a[i][p] * b[p][j]; return res; } template vector> &operator*=(vector> &a, const vector> &b) { a = a * b; return a; } template vector> operator^(const vector> &a, long long p) { vector> res = matrix_unit(a.size()); int highest_one_bit = -1; while (1LL << (highest_one_bit + 1) <= p) ++highest_one_bit; for (int i = highest_one_bit; i >= 0; i--) { res *= res; if (p >> i & 1) { res *= a; } } return res; } template vector> transpose(const vector> &a) { int n = a.size(); int m = a[0].size(); vector> b(m, vector(n)); for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { b[j][i] = a[i][j]; } } return b; } // a + a^2 + ... + a^p template vector> matrix_pow_sum(const vector> &a, long long p) { int n = a.size(); vector> res = vector>(n, vector(n)); vector> b = matrix_unit(n); int highest_one_bit = -1; while (1LL << (highest_one_bit + 1) <= p) ++highest_one_bit; for (int i = highest_one_bit; i >= 0; i--) { res = res * (matrix_unit(n) + b); b *= b; if (p >> i & 1) { b *= a; res = res * a + a; } } return res; } // returns f[n] = f[n-1]*a[k-1] + ... + f[n-k]*a[0], where f[0], ..., f[k-1] are provided // O(k^3*log(n)) complexity template T nth_element_of_recurrence(const vector &a, const vector &f, long long n) { int k = f.size(); if (n < k) return f[n]; vector> A(k, vector(k)); A[k - 1] = a; for (int i = 0; i < k - 1; ++i) { A[i][i + 1] = 1; } vector> F = transpose(vector>{f}); return ((A ^ n) * F)[0][0]; } template void matrix_print(const vector> &a) { for (auto &row : a) { for (T x : row) cout << (int)x << " "; cout << endl; } }