Pagini recente » Cod sursa (job #1150968) | Cod sursa (job #735397) | Cod sursa (job #3149274) | Cod sursa (job #2531774) | Cod sursa (job #2081057)
#include <bits/stdc++.h>
using namespace std;
ifstream in("padure2.in");
ofstream out("padure2.out");
#define x first
#define y second
const int NMAX = 1e6, CMAX = 1e3, MOD = 2000003;
int n, m;
long long dp[CMAX + 2];
long long fact[2 * NMAX + 2];
int nc;
vector<pair<int, int>> ciuperci;
void factorial();
int exp(int b, int e);
int comb(int n, int k);
int main()
{
factorial();
in >> n >> m;
in >> nc;
for(int i = 1; i <= nc; i++)
{
int x, y;
in >> x >> y;
ciuperci.push_back({x, y});
}
ciuperci.push_back({n, m});
sort(ciuperci.begin(), ciuperci.end());
for(int i = 0; i < ciuperci.size(); i++)
{
long long x2 = ciuperci[i].x, y2 = ciuperci[i].y;
dp[i] = comb(x2 + y2 - 2, x2 - 1) % MOD;
for(int j = 0; j < i; j++)
{
long long x1 = ciuperci[j].x, y1 = ciuperci[j].y;
long long ans = (1LL * dp[j] * comb(x2 - x1 + y2 - y1, x2 - x1)) % MOD;
dp[i] = (dp[i] - ans + MOD) % MOD;
}
}
out << dp[ciuperci.size() - 1] << '\n';
return 0;
}
void factorial()
{
fact[0] = fact[1] = 1;
for(int i = 2; i <= 2 * NMAX; i++)
fact[i] = (1LL * fact[i - 1] * i) % MOD;
}
int exp(int b, int e)
{
int ans;
for(ans = 1; e; e >>= 1)
{
if(e & 1) ans = (1LL * ans * b) % MOD;
b = (1LL * b * b) % MOD;
}
return ans;
}
int comb(int n, int k)
{
return (1LL * fact[n] * exp(fact[k], MOD - 2) % MOD * exp(fact[n - k], MOD - 2) % MOD) % MOD;
}