#pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") #include #include using namespace std; #define FOR(i, begin, end) for(int i=(begin),i##_end_=(end);i; int M; Mat operator*(const Mat &a, const Mat &b) { Mat ret{}; REP(i, 3) REP(j, 3) { auto v = a[i * 3 + 0] * b[0 * 3 + j] + a[i * 3 + 1] * b[1 * 3 + j] + a[i * 3 + 2] * b[2 * 3 + j]; ret[i * 3 + j] = v % M; } return ret; } int main() { int N; cin >> N >> M; Mat dp1, trans1; dp1.fill(0); dp1[0] = dp1[4] = dp1[8] = 1; trans1.fill(1); trans1[2] = 0; auto setter = [&](long long i) { trans1[1 * 3 + 0] = i + 1; trans1[2 * 3 + 0] = i * (i + 1) % M; trans1[2 * 3 + 1] = i; }; long long ret = 1; REP(i, N - 1) { setter(i * 2); dp1 = trans1 * dp1; setter(i * 2 + 1); dp1 = trans1 * dp1; ret = ret * dp1[0 * 3 + 2] % M; } FOR(i, 1, N * 2) ret = ret * i % M; cout << ret << '\n'; }