#pragma GCC optimize("Ofast,unroll-all-loops")
#include <bits/stdc++.h>
using namespace std;
int solve(vector<pair<int, int>> &a) {
int st = 0, ans = 0;
for (auto &[l, r] : a) {
if (l < st) {
continue;
}
ans++;
st = r;
}
return ans;
}
int solve_bad(vector<pair<int, int>> &a) {
return solve(a);
}
int solve_good(vector<pair<int, int>> &a) {
vector<int> vs(16, -1);
for (auto &[l, r] : a) {
vs[r] = l;
}
vector<pair<int, int>> b;
b.reserve(16);
for (int i = 0; i < 16; ++i) {
if (vs[i] != -1) {
b.push_back({vs[i], i});
}
}
return solve(b);
}
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int n, md;
cin >> n >> md;
int64_t ans = 0;
string s = string(n, '*') + string(n, '.');
sort(s.begin(), s.end());
do {
vector<int> a, b;
a.reserve(8), b.reserve(8);
for (int i = 0; i < 2 * n; ++i) {
if (s[i] == '*') {
a.push_back(i);
} else {
b.push_back(i);
}
}
do {
int good = 1;
vector<pair<int, int>> v;
v.reserve(8);
for (int i = 0; i < n; ++i) {
if (a[i] > b[i]) {
good = 0;
}
v.push_back({a[i], b[i]});
}
if (!good) {
continue;
}
if (solve_bad(v) != solve_good(v)) {
ans++;
}
} while (next_permutation(b.begin(), b.end()));
} while (next_permutation(s.begin(), s.end()));
cout << ans % md << '\n';
}