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