#include #include using namespace std; using ll = long long; using mint = atcoder::modint; /* (X)(Y) (*(X)) ((X)*) (*(*)(*)) ((*)*(*)) */ int main(){ int n, m; cin >> n >> m; if(n % 3 != 0){ cout << "0\n"; return 0; } n /= 3; mint::set_mod(m); vector> dp(n + 1, vector(n + 1)); vector> dp2(n + 1, vector(n + 1)); vector used(2, vector(n + 1, vector(n + 1))); auto rec = [&](auto rec, int l, int r, int s) -> mint { if(l == r) return 1; if(l + 1 == r) return 1; mint res = 0; if(s == 0){ if(used[s][l][r]) return dp[l][r]; res += rec(rec, l, r, 1); for(int m = l + 1; m < r; m++){ res += rec(rec, l, m, 1) * rec(rec, m, r, 0); } used[s][l][r] = true; return dp[l][r] = res; } if(used[s][l][r]) return dp2[l][r]; for(int m = l; m < r; m++){ res += rec(rec, l, m, 0) * rec(rec, m + 1, r, 0); } used[s][l][r] = true; return dp2[l][r] = res; }; cout << rec(rec, 0, n, 0).val() << '\n'; }