V<mint> jie(2 * n + 5, 1), ni(2 * n + 5); For(i, 1, 2 * n) jie[i] = jie[i - 1] * i; ni[2 * n] = jie[2 * n].inv(); Rep(i, 2 * n, 1) ni[i - 1] = ni[i] * i; auto C = [&](int x, int y) { if (x < y || y < 0) return0_m; return jie[x] * ni[y] * ni[x - y]; };
// dep int T = X - 1; poly L(T + 1); For(i, 0, T) L[i] = (C(2 * T - i, T) - C(2 * T - i, T + 1)) * ni[i]; T = n - X; poly R(T + 1); For(i, 0, T) R[i] = (C(2 * T - i, T) - C(2 * T - i, T + 1)) * ni[i]; poly dres = L * R; For(i, 0, n - 1) dres[i] *= jie[i];
// siz fill(all(L), 0); For(i, 0, X - 1) L[i] = C(2 * i, i) - C(2 * i, i - 1); fill(all(R), 0); For(i, 0, n - X) R[i] = C(2 * i, i) - C(2 * i, i - 1); poly sres = L * R; For(i, 0, n - 1) { int t = n - i - 1; sres[i] *= C(2 * t, t) - C(2 * t, t - 1); }
// merge mint Ans = dres[0]; cout << Ans << '\n'; For(i, 2, n) cout << (Ans += dres[i - 1] - sres[n - i + 1]) << '\n'; }