Pagini recente » Cod sursa (job #2882238) | Cod sursa (job #3200091) | Cod sursa (job #2069337) | Cod sursa (job #352176) | Cod sursa (job #2839262)
#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";
}