Cod sursa(job #2839262)

Utilizator ptudortudor P ptudor Data 25 ianuarie 2022 17:44:59
Problema Padure2 Scor 0
Compilator cpp-64 Status done
Runda Arhiva ICPC Marime 1.75 kb
#include <bits/stdc++.h>
#define int long long
using namespace std;

#ifdef LOCAL
ifstream in("in.in");
ofstream out("out.out");
#else
ifstream in("padure2.in");
ofstream out("padure2.out");
#endif

const int mmax = 3000005, mod = 2000003;
int n, m, c, fact[mmax], dp[mmax];
vector<pair<int, int>> v;
bool inside(pair<int, int> small, pair<int, int> big) {
    return (small.first <= big.first && small.second <= big.second);
}
int put(int x, int y) {
    int sol = 1;
    while (y) {
        if (y % 2) {
            sol = sol * x % mod;
        }
        x = x * x % mod;
        y /= 2;
    }
    return sol;
}
int inv(int x) {
    return put(x, mod - 2);
}
int comb(int n, int k) {
    return fact[n] * inv(fact[n - k]) % mod * inv(fact[k]) % mod;
}

int rect(int a, int b) {
    return comb(a + b, a);
}

void selfneg(int &a, int b) {
    a = ((a - b) % mod + mod) % mod;
}
int32_t main() {
    in >> n >> m;
    in >> c;
    fact[0] = 1;
    for (int i = 1; i <= 2 * max(n, m); i++) {
        fact[i] = fact[i - 1] * i % mod;
    }
    v.resize(c + 1);
    for (int i = 1; i <= c; i++) {
        int y, x;
        in >> y >> x;
        v[i] = {y, x};
    }

    for (int i = 0; i <= c; i++) dp[i] = 0;
    for (int i = 1; i <= c; i++) {
        dp[i] = comb(v[i].first + v[i].second - 2, v[i].first - 1);
        for (int j = 1; j < i; j++) {
            if (inside(v[j], v[i])) {
                selfneg(dp[i], dp[j] * rect(v[i].first - v[j].first, v[i].second - v[j].second));
            }
        }
    }

    int sol = comb(n + m - 2, n - 1);
    for (int i = 1; i <= c; i++) {
        selfneg(sol, dp[i] * comb(n - v[i].first + (m - v[i].second), m - v[i].second));
    }

    out << (sol + mod) % mod << "\n";
}