inlinevoidadd_edge(int x, int y){ G[x].pb (y), G[y].pb (x); }
namespace MATH { int fac[Maxn], ifac[Maxn];
inlineintfpm(int a, int b) { int ans = 1; for (int i = b; i; i >>= 1, a = (LL) a * a % Mod) if (i & 1) ans = (LL) ans * a % Mod; return ans; } inlineintC(int n, int m){ return (LL) fac[n] * ifac[m] % Mod * ifac[n - m] % Mod; } inlineintInvC(int n, int m){ return (LL) ifac[n] * fac[m] % Mod * fac[n - m] % Mod; } inlinevoidinit(int n) { fac[0] = 1; for (int i = 1; i <= n; ++i) fac[i] = (LL) fac[i - 1] * i % Mod; ifac[n] = fpm (fac[n], Mod - 2); for (int i = n - 1; i >= 0; --i) ifac[i] = (LL) ifac[i + 1] * (i + 1) % Mod; } }
using MATH :: C; using MATH :: InvC;
inlineintCalc(int l, int r) { if (l + 1 == r) return1; int mid = *lower_bound (G[r].begin(), G[r].end(), l + 1); return (LL) C (r - l - 2, mid - l - 1) * Calc (l, mid) % Mod * Calc (mid, r) % Mod; }
inlinevoidSolve() { int step = 0, ans = 1;
for (int i = 1; i < G[N].size(); ++i) { int x = G[N][i - 1], y = G[N][i], sum = y - x - 1; ans = (LL) ans * C (step + sum, sum) % Mod; ans = (LL) ans * Calc (x, y) % Mod; step += sum; }
if (!OP) cout << step << endl; elsecout << step << ' ' << ans << endl;
M = read<int>();
while (M--) { int x = read<int>(), y = read<int>(), step_now = step, ans_now = ans;
int l = *lower_bound (G[y].begin(), G[y].end(), x + 1); int r = *lower_bound (G[x].begin(), G[x].end(), y + 1); int sum_all = y - x - 1, lsum = l - x - 1, rsum = y - l - 1;
if (r == N) { --step_now; ans_now = (LL) ans_now * InvC (step, sum_all) % Mod; ans_now = (LL) ans_now * InvC (lsum + rsum, lsum) % Mod; ans_now = (LL) ans_now * C (step_now - rsum, lsum) % Mod; ans_now = (LL) ans_now * C (step_now, rsum) % Mod; } else { int lsum_f = y - x - 1, rsum_f = r - y - 1; int rsum_new = r - l - 1; ans_now = (LL) ans_now * InvC (lsum + rsum, lsum) % Mod; ans_now = (LL) ans_now * InvC (lsum_f + rsum_f, lsum_f) % Mod; ans_now = (LL) ans_now * C (rsum + rsum_f, rsum) % Mod; ans_now = (LL) ans_now * C (lsum + rsum_new, lsum) % Mod; }
if (OP) printf("%d %d\n", step_now, ans_now); elseprintf("%d\n", step_now); } }
inlinevoidInput() { OP = read<int>(); MATH :: init (N = read<int>());
for (int i = 1; i <= N - 3; ++i) { int x = read<int>(), y = read<int>(); add_edge (x, y); } for (int i = 1; i <= N; ++i) add_edge (i, i % N + 1);
for (int i = 1; i <= N; ++i) sort (G[i].begin (), G[i].end ()); }