func_code_string: #include <bits/stdc++.h>   using namespace std;   mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());   long long fastexp(long long b, long long exp) {     if (exp == 0) return 1;     long long temp = fastexp(b, exp / 2);     temp = (temp * temp) % 998244353;     if (exp % 2 == 1) temp *= b;     return temp % 998244353;   }   long long fact[100001], inv[100001];   void precompute() {     fact[0] = 1;     inv[0] = 1;     for (int i = 1; i <= 100000; i++) {       fact[i] = (fact[i - 1] * i) % 998244353;       inv[i] = fastexp(fact[i], 998244353 - 2);     }   }   long long choose(int n, int k) {     if (n < 0 || k < 0 || k > n) return 0;     long long ans = (fact[n] * inv[k]) % 998244353;     ans = (ans * inv[n - k]) % 998244353;     return ans;   }   bool row[3605], col[3605];   int H, W, N;   long long dp1[3605][3605], dp2[3605][3605];   int emptyH, emptyW;   int main() {     ios_base::sync_with_stdio(0);     cin.tie(0);     precompute();     cin >> H >> W >> N;     for (int i = 0; i < N; i++) {       int r1, c1, r2, c2;       cin >> r1 >> c1 >> r2 >> c2;       row[r1] = true;       row[r2] = true;       col[c1] = true;       col[c2] = true;     }     for (int i = 1; i <= H; i++)       if (!row[i]) emptyH++;     for (int i = 1; i <= W; i++)       if (!col[i]) emptyW++;     dp1[0][0] = true;     for (int i = 1; i <= H; i++) {       for (int j = 0; j <= i; j++) {         if (row[i] || row[i - 1])           dp1[i][j] = dp1[i - 1][j];         else {           dp1[i][j] = dp1[i - 1][j];           if (i - 2 >= 0 && j - 1 >= 0) dp1[i][j] += dp1[i - 2][j - 1];           dp1[i][j] %= 998244353;         }       }     }     dp2[0][0] = true;     for (int i = 1; i <= W; i++) {       for (int j = 0; j <= i; j++) {         if (col[i] || col[i - 1])           dp2[i][j] = dp2[i - 1][j];         else {           dp2[i][j] = dp2[i - 1][j];           if (i - 2 >= 0 && j - 1 >= 0) dp2[i][j] += dp2[i - 2][j - 1];           dp2[i][j] %= 998244353;         }       }     }     long long ans = 0;     for (int i = 0; i <= H; i++) {       for (int j = 0; j <= W; j++) {         long long R = dp1[H][j] * choose(emptyH - 2 * j, i);         R %= 998244353;         long long C = dp2[W][i] * choose(emptyW - 2 * i, j);         C %= 998244353;         long long F = (fact[i] * fact[j]) % 998244353;         ans += ((R * C) % 998244353 * F) % 998244353;         ans %= 998244353;       }     }     cout << ans << endl;     return 0;   }   