fenwickTree(LL N): n(N) { LL val; tree.resize(n + 10, 0); for (LL i = 0; i < n; i++) { SLL(val); update(i, val); } }
int main() { getFactors(); LL t, n, m, q, r; SLL(t); while (t--) { nr.clear(); dr.clear(); SLL(n), SLL(m), SLL(q); if (n <= 500) { query.resize(q); answers.resize(q); for (LL i = 0; i < q; i++) { SLL(r); query[i] = mp(min(r, n - r), i); } sortv(query); LL lim, start = 1, end = n; for (LL i = 0; i < q; i++) { lim = query[i].f; for (; start <= lim; start++) { LL sz = factor[start].size(); for (LL k = 0; k < sz; k++) { LL val = factor[start][k].f; LL v = dr[val]; v += factor[start][k].s; dr[val] = v; } } start = lim + 1; for (; end >= n - lim + 1; end--) { LL sz = factor[end].size(); for (LL k = 0; k < sz; k++) { LL val = factor[end][k].f; LL v = nr[val]; v += factor[end][k].s; nr[val] = v; } } end = n - lim; LL ans = 1; for (map_it = nr.begin(); map_it != nr.end(); map_it++) { LL prod = powMod(map_it->first, map_it->second - dr[map_it->first], m); ans = (ans * prod) % m; } if (ans < 0) ans += m; answers[query[i].s] = ans; } for (LL i = 0; i < q; i++) printf("%lld\n", answers[i]); } else { powers.resize(n + 1); inverse.resize(n + 1); answers.resize(n + 1); inverse[0] = powers[0] = 1; LL phi = etf(m); for (LL i = 1; i <= n; i++) { powers[i] = powMod(i%m, i, m); inverse[i] = powMod(powMod(i, phi - 1, m), i, m); } answers[1] = answers[n - 1] = powers[n]; for (LL i = 2; i <= n/2; i++) { LL val = answers[i - 1]; val = (val * powers[n - i + 1]) % m; val = (val * inverse[i]) % m; answers[i] = answers[n - i] = val; } while (q--) { SLL(r); printf("%lld\n", answers[r]); } } } return 0; }