Pagini recente » Cod sursa (job #333324) | Cod sursa (job #1232731) | Cod sursa (job #818533) | Cod sursa (job #2168776) | Cod sursa (job #2738394)
#include <cstdio>
#include <algorithm>
using namespace std;
const int mod = 2000003;
struct punct {
int x, y;
};
punct v[1010];
int d[1010], fact[2000010];
int cmp(punct a, punct b) {
if (a.x == b.x) return a.y < b.y;
else return a.x < b.x;
}
int rid_put(int a, int b) {
int sol = 1;
for (int i = 1; i <= b; i <<= 1) {
if (b & i) sol = (1LL * sol * a) % mod;
a = (1LL * a * a) % mod;
}
return sol;
}
int main() {
freopen("padure2.in", "r", stdin);
freopen("padure2.out", "w", stdout);
int n, m, c, a, b, c1;
scanf("%d%d%d", &n, &m, &c);
for (int i = 1; i <= c; i++)
scanf("%d%d", &v[i].x, &v[i].y);
c++;
fact[0] = 1;
for (int i = 1; i <= n + m; i++)
fact[i] = (1LL * fact[i - 1] * i) % mod;
v[c] = {n, m};
sort(v + 1, v + c + 1, cmp);
for (int i = 1; i <= c; i++) {
a = v[i].x + v[i].y - 2;
b = v[i].x - 1;
d[i] = (1LL * fact[a] * rid_put((1LL * fact[b] * fact[a - b]) % mod, mod - 2)) % mod;
for (int j = 1; j < i; j++)
if (v[j].x <= v[i].x && v[j].y <= v[i].y) {
a = (v[i].x - v[j].x) + (v[i].y - v[j].y);
b = v[i].x - v[j].x;
c1 = (1LL * fact[a] * rid_put((1LL * fact[b] * fact[a - b]) % mod, mod - 2)) % mod;
d[i] = (d[i] - (1LL * d[j] * c1) % mod + mod) % mod;
}
}
printf("%d", d[c]);
return 0;
}