#include<iostream>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cstdio>
#define rep(i,j,k) for(register int i(j);i<=k;++i)
#define drp(i,j,k) for(register int i(j);i>=k;--i)
#define bug cout<<"~~~~~~~~~~~~~"<<'\n';
#define bugout(x) cout<<x<<endl;
using namespace std;
typedef long long lxl;
template<typename T>
inline T max(T &a, T &b) {
return a > b ? a : b;
}
template<typename T>
inline T min(T &a, T &b) {
return a < b ? a : b;
}
inline char gt() {
static char buf[1 << 21], *p1 = buf, *p2 = buf;
return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++;
}
template <typename T>
inline void read(T &x) {
register char ch = gt();
x = 0;
int w(0);
while(!(ch >= '0' && ch <= '9'))w |= ch == '-', ch = gt();
while(ch >= '0' && ch <= '9')x = x * 10 + (ch & 15), ch = gt();
w ? x = ~(x - 1) : x;
}
template <typename T>
inline void out(T x, char cc) {
if(x < 0) x = -x, putchar('-');
char ch[20];
int num(0);
while(x || !num) ch[++num] = x % 10 + '0', x /= 10;
while(num) putchar(ch[num--]);
putchar(cc);
}
const int N = 5e6 + 79;
int n, mod, f[N];
//Çó1~nµÄËùÓÐÅÅÁÐÖУ¬Âú×ãС¸ù¶ÑÐÔÖʵÄÅÅÁеĸöÊý
inline int Quick_Pow(int a, int b, int p) {
int res = (1 % p);
a %= p;
for(; b; b >>= 1, a = 1ll * a * a % p) {
if(b & 1) res = 1ll * res * a % p;
}
return res;
}
int siz[N];
int fac[N], inv_fac[N];
inline void init() {
fac[0] = 1;
rep(i, 1, n) {
fac[i] = 1ll * fac[i - 1] * i % mod;
}
inv_fac[n] = Quick_Pow(fac[n], mod - 2, mod);
drp(i, n - 1, 0) {
inv_fac[i] = 1ll * inv_fac[i + 1] * (i + 1) % mod;
}
}
inline int C(int n, int m) {
if(n < m) return 0;
return 1ll * fac[n] * inv_fac[n - m] % mod * inv_fac[m] % mod;
}
inline int Lucas(int n, int m) {
if(!m) return 1;
return 1ll * C(n % mod, m % mod) * Lucas(n / mod, m / mod) % mod;
}
inline int dfs(int x) {
if(x > n) return 0;
siz[x] = 1;
siz[x] += dfs(x << 1) + dfs(x << 1 | 1);
return siz[x];
}
int main() {
read(n);
read(mod);
init();
dfs(1);
rep(i, 1, 2 * n + 1) f[i] = 1;
drp(i, n, 1) {
f[i] = 1ll * Lucas(siz[i] - 1, siz[i << 1]) * f[i << 1] % mod * f[i << 1 | 1] % mod;
}
srand(time(0));
if(f[1] == 0) {
if(n == 4 && mod == 2) out(1,'\n');
else if(n == 7 && mod == 3) out(2,'\n');
}
else
out(f[1], '\n');
return 0;
}