提交时间:2025-10-27 15:56:04

运行 ID: 38778

#include <bits/stdc++.h> using namespace std; #define LL long long #define pii pair<int, int> #define fi first #define se second const int N = 5e4 + 5; const int K = 1005; const LL mod = 2500000001; int T, n, m, k; pii a[K]; int b[K]; int dis[N][K]; LL s[N << 1]; inline int min(int x, int y) { return x < y ? x : y; } inline int abs(int x) { return x > 0 ? x : -x; } inline LL qpow(LL a, LL b) { LL ans = 1; while (b) { if (b & 1) ans = ans * a % mod; b >>= 1; a = a * a % mod; } return ans; } void solve() { cin >> n >> m >> k; int cnt = 0; for (int i = 1; i <= k; i++) { cin >> a[i].fi >> a[i].se; b[++cnt] = a[i].se; } sort(b + 1, b + cnt + 1); cnt = unique(b + 1, b + cnt + 1) - b - 1; for (int i = 1; i <= n; i++) for (int j = 1; j <= cnt; j++) dis[i][j] = 1e9; for (int i = 1; i <= k; i++) { a[i].se = lower_bound(b + 1, b + cnt + 1, a[i].se) - b; dis[a[i].fi][a[i].se] = 0; } for (int i = 2; i <= n; i++) for (int j = 1; j <= cnt; j++) dis[i][j] = min(dis[i][j], dis[i - 1][j] + 1); for (int i = n - 1; i; i--) for (int j = 1; j <= cnt; j++) dis[i][j] = min(dis[i][j], dis[i + 1][j] + 1); for (int i = 1; i <= n; i++) for (int j = 2; j <= cnt; j++) dis[i][j] = min(dis[i][j], dis[i][j - 1] + b[j] - b[j - 1]); for (int i = 1; i <= n; i++) for (int j = cnt - 1; j; j--) dis[i][j] = min(dis[i][j], dis[i][j + 1] + b[j + 1] - b[j]); for (int i = 0; i <= n + m - 2; i++) s[i] = 0; for (int i = 1; i <= n; i++) { s[dis[i][1] + 1]++, s[dis[i][1] + b[1]]--; for (int j = 1; j < cnt; j++) { s[dis[i][j]]++; int p = (dis[i][j + 1] + b[j + 1] - b[j] - dis[i][j]) / 2; p = min(p, b[j + 1] - b[j] - 1); s[dis[i][j] + p + 1]--; p = b[j + 1] - b[j] - p - 1; s[dis[i][j + 1] + 1]++, s[dis[i][j + 1] + p + 1]--; } s[dis[i][cnt]]++, s[dis[i][cnt] + m - b[cnt] + 1]--; //for (int j = 1; j <= cnt; j++) // cout << i << " " << j << " " << dis[i][j] << endl; } for (int i = 1; i <= n + m - 2; i++) s[i] = (s[i] + s[i - 1]) % mod; for (int i = 1; i <= n + m - 2; i++) s[i] = (s[i] + s[i - 1]) % mod; LL fz = 1, fm = 1; for (int i = 0; i <= n + m - 3; i++) { //cout << i << " " << s[i] << endl; fz = fz * ((s[i] - i) % mod) % mod; fm = fm * ((1LL * n * m - i) % mod) % mod; } cout << fz * qpow(fm, mod - 2) % mod << '\n'; } signed main() { ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); cin >> T; while (T--) solve(); return 0; }