#include // #include #include #include #include using namespace std; // using namespace atcoder; // using mint = modint998244353; // using mint = modint1000000007; using vi = vector; using vvi = vector>; using ll = long long; template using max_heap = priority_queue; template using min_heap = priority_queue, greater<>>; #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define rep2(i, f, n) for (int i = (int) f; i < (int)(n); i++) #define repd(i, n, l) for (int i = (int) n; i >= (int) l; i--) const ll inf = ll(1e9+7); // from noshi91's library #include class runtime_modint { using u64 = std::uint_fast64_t; static u64 &mod() { static u64 mod_ = 0; return mod_; } public: u64 a; runtime_modint(const u64 x = 0) : a(x % get_mod()) {} u64 &value() noexcept { return a; } const u64 &value() const noexcept { return a; } runtime_modint operator+(const runtime_modint rhs) const { return runtime_modint(*this) += rhs; } runtime_modint operator-(const runtime_modint rhs) const { return runtime_modint(*this) -= rhs; } runtime_modint operator*(const runtime_modint rhs) const { return runtime_modint(*this) *= rhs; } runtime_modint operator/(const runtime_modint rhs) const { return runtime_modint(*this) /= rhs; } runtime_modint &operator+=(const runtime_modint rhs) { a += rhs.a; if (a >= get_mod()) { a -= get_mod(); } return *this; } runtime_modint &operator-=(const runtime_modint rhs) { if (a < rhs.a) { a += get_mod(); } a -= rhs.a; return *this; } runtime_modint &operator*=(const runtime_modint rhs) { a = a * rhs.a % get_mod(); return *this; } runtime_modint &operator/=(runtime_modint rhs) { u64 exp = get_mod() - 2; while (exp) { if (exp % 2) { *this *= rhs; } rhs *= rhs; exp /= 2; } return *this; } static void set_mod(const u64 x) { mod() = x; } static u64 get_mod() { return mod(); } }; // from ei1333's library template< class T > struct Matrix { vector< vector< T > > A; Matrix() {} Matrix(size_t n, size_t m) : A(n, vector< T >(m, 0)) {} Matrix(size_t n) : A(n, vector< T >(n, 0)) {}; size_t height() const { return (A.size()); } size_t width() const { return (A[0].size()); } inline const vector< T > &operator[](int k) const { return (A.at(k)); } inline vector< T > &operator[](int k) { return (A.at(k)); } static Matrix I(size_t n) { Matrix mat(n); for(int i = 0; i < n; i++) mat[i][i] = 1; return (mat); } Matrix &operator+=(const Matrix &B) { size_t n = height(), m = width(); assert(n == B.height() && m == B.width()); for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) (*this)[i][j] += B[i][j]; return (*this); } Matrix &operator-=(const Matrix &B) { size_t n = height(), m = width(); assert(n == B.height() && m == B.width()); for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) (*this)[i][j] -= B[i][j]; return (*this); } Matrix &operator*=(const Matrix &B) { size_t n = height(), m = B.width(), p = width(); assert(p == B.height()); vector< vector< T > > C(n, vector< T >(m, 0)); for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) for(int k = 0; k < p; k++) C[i][j] = (C[i][j] + (*this)[i][k] * B[k][j]); A.swap(C); return (*this); } Matrix &operator^=(long long k) { Matrix B = Matrix::I(height()); while(k > 0) { if(k & 1) B *= *this; *this *= *this; k >>= 1LL; } A.swap(B.A); return (*this); } Matrix operator+(const Matrix &B) const { return (Matrix(*this) += B); } Matrix operator-(const Matrix &B) const { return (Matrix(*this) -= B); } Matrix operator*(const Matrix &B) const { return (Matrix(*this) *= B); } Matrix operator^(const long long k) const { return (Matrix(*this) ^= k); } friend ostream &operator<<(ostream &os, Matrix &p) { size_t n = p.height(), m = p.width(); for(int i = 0; i < n; i++) { os << "["; for(int j = 0; j < m; j++) { os << p[i][j] << (j + 1 == m ? "]\n" : ","); } } return (os); } T determinant() { Matrix B(*this); assert(width() == height()); T ret = 1; for(int i = 0; i < width(); i++) { int idx = -1; for(int j = i; j < width(); j++) { if(B[j][i] != 0) idx = j; } if(idx == -1) return (0); if(i != idx) { ret *= -1; swap(B[i], B[idx]); } ret *= B[i][i]; T vv = B[i][i]; for(int j = 0; j < width(); j++) { B[i][j] /= vv; } for(int j = i + 1; j < width(); j++) { T a = B[j][i]; for(int k = 0; k < width(); k++) { B[j][k] -= B[i][k] * a; } } } return (ret); } }; int main() { int n, m; cin >> n >> m; runtime_modint::set_mod(m); Matrix mat(2); mat[0][0].a = 1; mat[0][1].a = 1; mat[1][0].a = 1; mat[1][1].a = 0; mat.operator^=(n-3); cout << (mat[0][0] + mat[0][1]).a << endl; return 0; }