#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define chmax(x, y) x = max(x, y) #define chmin(x, y) x = min(x, y) #define rep(i, n) for (ll i = 0; i < (n); ++i) #define repLRE(i, l, r) for (ll i = (l); i <= (r); ++i) #define Sort(v) sort(v.begin(), v.end()) #define Reverse(v) reverse(v.begin(), v.end()) #define Lower_bound(v, x) \ distance(v.begin(), lower_bound(v.begin(), v.end(), x)) #define Upper_bound(v, x) \ distance(v.begin(), upper_bound(v.begin(), v.end(), x)) using ll = long long; using ull = unsigned long long; using P = pair; using T = tuple; using vll = vector; using vP = vector

; using vT = vector; using vvll = vector>; using vvP = vector>; using dqll = deque; ll dx[9] = {-1, 1, 0, 0, -1, -1, 1, 1, 0}; ll dy[9] = {0, 0, -1, 1, -1, 1, -1, 1, 0}; /* Macros reg. ends here */ const ll INF = 1LL << 50; // static const long long mod = 1000000007; ll mod; vvll matmul(vvll& a, vvll& b) { ll xx = a.size(); ll zz = a[0].size(); assert(zz == (ll)b.size()); ll yy = b[0].size(); vvll ret(xx, vll(yy)); rep(i, xx) rep(j, yy) { ll val = 0; rep(k, zz) { val += a[i][k] * b[k][j]; ret[i][j] = val % mod; } } return ret; } vvll matpow(vvll& m, ll n) { // m^n ll xx = m.size(); assert(xx == (ll)m[0].size()); vvll ret(xx, vll(xx, 0)); vvll cum = m; rep(i, xx) ret[i][i] = 1; if (n == 0) return ret; while (n >= 2) { if (n % 2 != 0) { ret = matmul(cum, ret); } cum = matmul(cum, cum); n /= 2; } ret = matmul(ret, cum); return ret; } int main() { ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0); cout << fixed << setprecision(15); ll n; cin >> n >> mod; vvll fmat = {{1, 1}, {1, 0}}; vvll nmat = matpow(fmat, n-1); ll ans = nmat[1][0] % mod; cout << ans << endl; return 0; }