#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;
}