import java.io.*; import java.util.*; import java.text.*; import java.math.*; import java.util.regex.*; class Task { public void solve(int testNumber, InputReader in, PrintWriter out) { int n = in.nextInt(), m = in.nextInt(); long mod = (long)m * 3; int cn = ((n + 1) >> 1), tn = (n & 1); BigInteger ret = BigInteger.valueOf(1); BigInteger ba = BigInteger.valueOf(4); BigInteger bmod = BigInteger.valueOf(mod); while (cn > 0) { if ((cn & 1) == 1) ret = ret.multiply(ba).mod(bmod); ba = ba.multiply(ba).mod(bmod); cn >>= 1; } ret = ret.add(bmod).subtract(BigInteger.valueOf(1)).mod(bmod); ret = ret.divide(BigInteger.valueOf(3)); if (tn == 0) { ret = ret.multiply(BigInteger.valueOf(2)).mod(BigInteger.valueOf(m)); } out.println(ret); } } public class Main { public static void main(String[] args) { InputStream inputStream = System.in; OutputStream outputStream = System.out; InputReader in = new InputReader(inputStream); PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(outputStream))); Task solver = new Task(); while (in.hasMoreTokens()) { solver.solve(1, in, out); } out.close(); } } class InputReader { BufferedReader br; StringTokenizer st; public InputReader(File f) { try { br = new BufferedReader(new FileReader(f)); } catch (FileNotFoundException e) { e.printStackTrace(); } } public InputReader(InputStream f) { br = new BufferedReader(new InputStreamReader(f)); } String next() { while (st == null || !st.hasMoreTokens()) { String s = null; try { s = br.readLine(); } catch (IOException e) { e.printStackTrace(); } if (s == null) return null; st = new StringTokenizer(s); } return st.nextToken(); } boolean hasMoreTokens() { while (st == null || !st.hasMoreTokens()) { String s = null; try { s = br.readLine(); } catch (IOException e) { e.printStackTrace(); } if (s == null) return false; st = new StringTokenizer(s); } return true; } int nextInt() { return Integer.parseInt(next()); } long nextLong() { return Long.parseLong(next()); } double nextDouble() { return Double.parseDouble(next()); } }