#include using namespace std; using ll = long long; using pii = pair; using pll = pair; using vb = vector; using vi = vector; using vll = vector; using vvi = vector; using vvll = vector; using vpii = vector; using vpll = vector; using vs = vector; using vc = vector; #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define all(a) (a).begin(), (a).end() #define rrep(i,n) for(int i = (int)(n) - 1; i>=0; i--) #define rep1(i,n) for(int i=1; i <=(int)(n);i++) #define reps(i,s,n) for(int i=(int)(s);i<(int)(n); i++) template using min_pq = priority_queue, greater>; template bool chmin(T& a, const T& b){if(b bool chmax(T& a, const T& b){if(a> a; Matrix(int n, int m, ll mod) : n(n), m(m), mod(mod), a(n, vector(m, 0)) {} Matrix(const vector>& v, ll mod) : n(v.size()), m(v.empty() ? 0 : v[0].size()), mod(mod), a(v) { normalize(); } void normalize() { for (auto& row : a) for (auto& x : row) x = ((x % mod) + mod) % mod; } static Matrix identity(int n, ll mod) { Matrix I(n, n, mod); for (int i = 0; i < n; i++) I.a[i][i] = 1 % mod; return I; } vector& operator[](int i) { return a[i]; } const vector& operator[](int i) const { return a[i]; } Matrix operator*(const Matrix& B) const { assert(m == B.n && mod == B.mod); Matrix C(n, B.m, mod); for (int i = 0; i < n; i++) { for (int k = 0; k < m; k++) { ll x = a[i][k]; if (!x) continue; for (int j = 0; j < B.m; j++) { C.a[i][j] = (C.a[i][j] + (__int128)x * B.a[k][j]) % mod; } } } return C; } vector operator*(const vector& v) const { assert((int)v.size() == m); vector r(n, 0); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (!a[i][j]) continue; r[i] = (r[i] + (__int128)a[i][j] * v[j]) % mod; } } return r; } Matrix pow(ll p) const { assert(n == m); Matrix R = identity(n, mod), A = *this; while (p > 0) { if (p & 1) R = R * A; A = A * A; p >>= 1; } return R; } Matrix operator+(const Matrix& B) const { assert(n == B.n && m == B.m && mod == B.mod); Matrix C(n, m, mod); for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) C.a[i][j] = (a[i][j] + B.a[i][j]) % mod; return C; } }; int main() { cin.tie(nullptr); ios::sync_with_stdio(false); cout << fixed << setprecision(16); ll n,m; cin >> n >> m; Matrix a(2,2,m); a[0][0]=1; a[0][1]=1; a[1][0]=1; a[1][1]=0; Matrix want = a.pow(n); vll times={0,1}; vll ans=want*times; cout << ans[1] << endl; }