#include <iostream>
using namespace std;
const int MAXN = 705;
long long nCr[MAXN][MAXN];
long long S[MAXN][MAXN];
long long power2[MAXN];
long long C_arr[MAXN][MAXN];
long long p_powers[MAXN];
long long E[MAXN];
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int N;
long long P;
if (!(cin >> N >> P)) return 0;
for (int i = 0; i <= N; ++i) {
nCr[i][0] = 1;
for (int j = 1; j <= i; ++j) {
nCr[i][j] = nCr[i - 1][j - 1] + nCr[i - 1][j];
if (nCr[i][j] >= P) nCr[i][j] -= P;
}
}
S[0][0] = 1;
for (int i = 1; i <= N; ++i) {
for (int j = 1; j <= i; ++j) {
S[i][j] = (S[i - 1][j - 1] + j * S[i - 1][j]) % P;
}
}
power2[0] = 1;
for (int i = 1; i <= N; ++i) {
power2[i] = (power2[i - 1] * 2);
if (power2[i] >= P) power2[i] -= P;
}
for (int k = 0; k <= N; ++k) {
long long x = power2[k];
p_powers[0] = 1;
for (int j = 1; j <= N; ++j) {
p_powers[j] = (p_powers[j - 1] * x) % P;
}
for (int s = 1; s <= N; ++s) {
long long sum = 0;
for (int j = 1; j <= s; ++j) {
long long term = (S[s][j] * p_powers[j]) % P;
if (j & 1) {
sum += term;
if (sum >= P) sum -= P;
} else {
sum -= term;
if (sum < 0) sum += P;
}
}
C_arr[s][k] = sum;
}
}
E[0] = 1;
for (int m = 1; m <= N; ++m) {
long long sum = 0;
for (int s = 1; s <= m; ++s) {
long long ways = C_arr[s][m - s];
long long term = (ways * E[m - s]) % P;
term = (term * nCr[m][s]) % P;
sum += term;
if (sum >= P) sum -= P;
}
E[m] = sum;
}
long long ans = 0;
for (int m = 0; m <= N; ++m) {
long long term = (nCr[N][m] * E[m]) % P;
ans += term;
if (ans >= P) ans -= P;
}
cout << ans << "\n";
return 0;
}