#include<bits/stdc++.h>
using namespace std;
#define task "a"
#define se second
#define fi first
#define ll long long
#define ii pair<ll, ll>
const long mxN = 3e3 + 2, MOD = 1e9 + 7;
int nRow, nCol, n;
ll gt[mxN * mxN], rev[mxN * mxN], dp[mxN][mxN];
ll pw(int j, int mx)
{
    if (!mx)
        return 1;
    ll res = pw(j, mx / 2);
    res = res * res % MOD;
    if (mx % 2)
        return res * j % MOD;
    return res;
}
ll C(int u, int v)
{
    return gt[v] * rev[u] % MOD * rev[v - u] % MOD;
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    //freopen(task".INP", "r", stdin);
    //freopen(task".OUT", "w", stdout);
    cin >> nRow >> nCol;
    cin >> n;
    ii l, r;
    for (int i = 1; i <= n; i++)
    {
        ii tmp;
        cin >> tmp.fi >> tmp.se;
        if (i == 1)
            l = r = tmp;
        l.fi = min(l.fi, tmp.fi);
        l.se = min(l.se, tmp.se);
        r.fi = max(r.fi, tmp.fi);
        r.se = max(r.se, tmp.se);
    }
    gt[0] = rev[0] = 1;
    for (int i = 1; i <= nRow * nCol; i++)
    {
        gt[i] = gt[i - 1] * i % MOD;
        rev[i] = pw(gt[i], MOD - 2) % MOD;
    }
    dp[r.fi - l.fi + 1][r.se - l.se + 1] = gt[(r.fi - l.fi + 1) * (r.se - l.se + 1) - n];
    for (int i = r.fi - l.fi + 1; i <= nRow; i++)
    {
        for (int j = r.se - l.se + 1; j <= nCol; j++)
        {
            dp[i][j + 1] = (dp[i][j + 1] + dp[i][j] * gt[i]) % MOD;
            dp[i + 1][j] = (dp[i + 1][j] + dp[i][j] * gt[j]) % MOD;
        }
    }
    cout << dp[nRow][nCol] * C(nRow - r.fi, nRow - (r.fi - l.fi + 1)) % MOD * C(nCol - r.se, nCol - (r.se - l.se + 1)) % MOD;
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |