Pagini recente » Cod sursa (job #1143767) | Cod sursa (job #570529) | Cod sursa (job #2484053) | Cod sursa (job #2647741) | Cod sursa (job #2260721)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("padure2.in");
ofstream fout("padure2.out");
const int MOD = 2000003;
int n, m, nrc;
int dp[1002], fact[2000002], inv[2000002];
struct Ciuperci {
int x, y;
}v[1002];
bool cmp (Ciuperci x, Ciuperci y) {
if (x.x == y.x)
return x.y < y.y;
else
return x.x < y.x;
}
int lol(int a, int b) {
int ans = 1;
while (b) {
if (b & 1)
ans = 1LL * ans * a % MOD;
a = 1LL * a * a % MOD;
b >>= 1;
}
return ans;
}
void precalculare() {
fact[0] = fact[1] = 1;
for(int i = 2; i <= 2000000; ++i)
fact[i] = (1LL * fact[i - 1] * i) % MOD;
inv[2000000] = lol(fact[2000000], MOD - 2);
for(int i = 2000000 - 1; i >= 0; --i)
inv[i] = (1LL * inv[i + 1] * (i + 1)) % MOD;
}
int comb(int n, int k) {
return (1LL * fact[n] * inv[k] * inv[n - k]) % MOD;
}
int main() {
precalculare();
fin >> n >> m >> nrc;
for (int i = 1; i <= nrc; ++i) {
fin >> v[i].x >> v[i].y;
}
sort(v + 1, v + 1 + nrc, cmp);
v[++nrc].x = n;
v[nrc].y = m;
for (int i = 1; i <= nrc; ++i) {
dp[i] = comb(v[i].x + v[i].y, v[i].x);
for (int j = 1; j < i; ++j)
if(v[j].y <= v[i].y)
dp[i] = (dp[i] - 1LL * dp[j] * comb(v[i].x - v[j].x + v[i].y - v[j].y, v[i].x - v[j].x) % MOD + MOD) % MOD;
}
fout << dp[nrc];
return 0;
}