#include int ri() { int n; scanf("%d", &n); return n; } int64_t rll() { long long n; scanf("%lld", &n); return n; } int main() { int64_t n = rll(); int m = ri(); if (m == 2) { std::cout << 0 << std::endl; return 0; } int cur = 2; std::map rep = { {1000000007, 250000001}, {1099999997, 61111110}, }; if (rep.count(m)) { n %= rep[m]; for (int i = 0; i < n; i++) cur = (int64_t) cur * (cur + 4) % m; } else { std::vector used(m); std::vector list; list.reserve(50000000); int i = 0; for (; i < n; i++) { if (used[cur]) break; used[cur] = true; list.push_back(cur); cur = (int64_t) cur * (cur + 4) % m; } int index; for (int i = 0; i < (int) list.size(); i++) if (list[i] == cur) { index = i; break; } int left = (n - i) % (i - index); for (int i = 0; i < left; i++) cur = (int64_t) cur * (cur + 4) % m; } std::cout << cur << std::endl; return 0; }