// generated by GPT 5 pro // LLMの作問能力評価のために自動生成された回答 // by CPCTF 運営チーム #include using namespace std; using u32 = uint32_t; using u64 = uint64_t; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T; u64 M; if (!(cin >> T >> M)) return 0; vector Ns(T); int Nmax = 0; for (int i = 0; i < T; ++i) { cin >> Ns[i]; if (Ns[i] > Nmax) Nmax = Ns[i]; } if (M == 1) { for (int i = 0; i < T; ++i) cout << 0 << '\n'; return 0; } // Precompute up to Nmax int Hmax = Nmax >> 1; // floor(N/2) int Mmax = Nmax >> 2; // floor(N/4) vector fact(Nmax + 1); fact[0] = 1 % M; for (int i = 1; i <= Nmax; ++i) { fact[i] = (u64)fact[i-1] * i % M; } vector invol(Nmax + 1); invol[0] = 1 % M; if (Nmax >= 1) invol[1] = 1 % M; for (int n = 2; n <= Nmax; ++n) { u64 term = (u64)(n - 1) * invol[n - 2] % M; invol[n] = (invol[n - 1] + term) % M; } vector S(Nmax + 1); S[0] = 1 % M; if (Nmax >= 1) S[1] = 1 % M; if (Nmax >= 2) S[2] = 2 % M; if (Nmax >= 3) S[3] = 2 % M; for (int n = 4; n <= Nmax; ++n) { int k = n - 2 - (n & 1); // N-3 if odd, N-2 if even u64 v = (2ULL * S[n - 2]) % M; v = (v + (u64)k * S[n - 4]) % M; S[n] = (u32)v; } // g[h] = 2^h * h! vector g(Hmax + 1); g[0] = 1 % M; for (int h = 1; h <= Hmax; ++h) { g[h] = (u64)g[h - 1] * (2ULL * h % M) % M; } // U[m] = (2m)! / m! via U[m] = U[m-1] * (4m - 2) vector U(Mmax + 1); U[0] = 1 % M; for (int m = 1; m <= Mmax; ++m) { u64 mul = (4ULL * m - 2ULL) % M; // 4m - 2 U[m] = (u64)U[m - 1] * mul % M; } // Answer queries for (int qi = 0; qi < T; ++qi) { int N = Ns[qi]; u64 nf = fact[N]; u64 I = invol[N]; u64 Sn = S[N]; u64 A = g[N >> 1]; u64 Q = 0; if ((N & 3) <= 1) { // N % 4 == 0 or 1 Q = U[N >> 2]; } u64 delta = (N == 1) ? 1 : 0; // Ans = 8*N! - 8*I + 6*S - 4*A - 2*Q + delta (mod M) long long res = 0; res += (long long)(8 % M) * nf % M; res -= (long long)(8 % M) * I % M; res += (long long)(6 % M) * Sn % M; res -= (long long)(4 % M) * A % M; res -= (long long)(2 % M) * Q % M; res += (long long)delta % M; res %= (long long)M; if (res < 0) res += M; cout << (u64)res % M << '\n'; } return 0; }