#include <bits/stdc++.h>
using namespace std;
long double PI = acos(-1);
long double DEL = 1e-10;
int M =  1e9 + 7;
const int N = 3e5 + 10;

#define ftt cin>>tc;for(int cas=1;cas<=tc;++cas)
#define all(a) a.begin(),a.end()
#define vpii vector<pair<int,int> >
#define vvi vector<vector<int> >
#define va(x) vector<array<int,(x)> >
#define pii pair<int,int>
#define vi vector<int>
#define sq(a) ((a)*(a))
#define double long double
#define dbg cout<<"\nhi\n";
#define int long long
#define nl cout<<"\n"
#define sp <<" "<<
#define S second
#define F first

template<class T> using minpq = priority_queue<T,vector<T>,greater<T> >;
struct DSU
{
        vi par,size;
        DSU (int n)
        {
                par.resize(n+1);
                size.resize(n+1);
                for(int i=0;i<=n;i++)
                {
                        par[i] = i;
                        size[i] = 1;
                }
        }
        
        int find(int x)
        {
                return par[x] = (x == par[x]? par[x]:find(par[x]));
                
        }
        
        void join(int x,int y)
        {
                int parx = find(x),pary = find(y);
                if(parx == pary)
                {
                        return;
                }
                if(size[parx] > size[pary])
                {
                        size[parx] += size[pary];
                        par[pary] = parx;
                }
                else
                {
                        size[pary] += size[parx];
                        par[parx] = pary;
                }
        }
};
int fpow(int x, int n)
{
        int res = 1;
        x %= M;
        while(n)
        {
                if(n&1)res = res * x % M;
                x = x * x % M;
                n>>=1;
        }
        return res;
}
int gcd(int a,int b)
{
        if(b == 0)return a;
        return gcd(b,a % b);
}
int lcm(int a,int b)
{
        return a*(b/gcd(a,b));
}
int popcount(int x)
{
        return bitset<65>(x).count();
}
vector<int> fac(N),inv(N);

void create_fac(int n)
{
        fac[0] = inv[0] = 1;
        for(int i=1;i<=n;i++)
        {
                fac[i] = fac[i-1]*i % M;
                inv[i] = fpow(fac[i],M-2);
        }
}
int ncr(int n,int r)
{
        if(r > n)return 0;
        return fac[n] * (inv[r] * inv[n-r] % M) % M;
        return fac[n] * (fpow(fac[r],M-2) * fpow(fac[n-r],M-2) % M ) % M;
}

void sieve (int n)
{
        vector<int> pf(N);
        pf[0] = pf[1] = 1;
        for (int i = 2; i <= n; i++) {
                if (!pf[i]) {
                        pf[i] = i;
                        for (int j = i * i; j <= n; j += i){
                                pf[j] = i;
                        }
                }
        }
        
}

//**************************************** CHECK CONSTRAINTS ***************************************
int cnt, sum, mid, mx, mn, ans, a[N], b[N];
int n, m, d, i, j, k, l, p, q, r, t, w, x, y, z, tc;
string s;

vvi dp(402,vi(402));


int32_t main()
{
        ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
        #ifndef ONLINE_JUDGE
        freopen("/Users/jenish/XCode/cp/input.txt","r",stdin);
        #endif
        cin >> n >> M;
        
        // dp[i][j] => done till i and had j gaps.
        
        
        for(int i = 1;i <= n;i++){
                dp[i][0] = fpow(2,i-1);
        }
        create_fac(n+2);
        for(int i = 2;i <= n;i++){
                for(int gaps = 1;gaps <= i - 2;gaps++){
                        //lgp = last gap position
                        for(int lgp = 2;lgp < i;lgp++){
                                //cout << i sp gaps sp lgp;nl;
                                //cout << dp[lgp - 1][gaps - 1] sp fpow(2,i - lgp - 1) sp ncr(i - gaps,i - lgp);nl;
                                dp[i][gaps] += (dp[lgp - 1][gaps - 1] * fpow(2,i - lgp - 1) % M) * ncr(i - gaps,i - lgp) % M;
                                dp[i][gaps] %= M;
                        }
                }
        }
        
        for(int gaps = 0;gaps < n - 1;gaps++){
                //cout<<gaps sp dp[n][gaps];nl;
                ans += dp[n][gaps];
                ans %= M;
        }
        cout << ans;
}


