Pagini recente » Cod sursa (job #1614984) | Cod sursa (job #198698) | Cod sursa (job #3220852) | Cod sursa (job #1131695) | Cod sursa (job #1711072)
using namespace std;
#include <fstream>
#include <vector>
#include <algorithm>
#include <string>
#define MOD 2000003
#define Vmax 2000002
#define Cmax 1010
using pii = pair<int, int>;
vector< pii > C;
int nrBad[Cmax], nrGood[Cmax];
int f[Vmax];
int comb(int, int);
int inv_mod(int);
int power(int, int);
void read(int&, int&);
void write(int);
int main()
{
int i, j, n, m, a, b;
for (f[0] = 1, i = 1; i < Vmax; ++i) f[i] = (1LL * f[i - 1] * i) % MOD;
read(n, m);
if (C.back() == make_pair(n, m))
{
write(0);
return 0;
}
C.emplace_back(n, m);
for (i = 0; i < C.size(); ++i)
{
nrBad[i] = 0;
for (j = 0; j < i; ++j)
if (C[j].first <= C[i].first && C[j].second <= C[i].second)
{
a = C[i].first - C[j].first + C[i].second - C[j].second;
b = C[i].first - C[j].first;
nrBad[i] += (1LL * nrGood[j] * comb(a, b)) % MOD;
if (nrBad[i] >= MOD) nrBad[i] -= MOD;
}
nrGood[i] = comb(C[i].first + C[i].second - 2, C[i].first - 1) - nrBad[i];
if (nrGood[i] < 0) nrGood[i] += MOD;
}
write(nrGood[C.size() - 1]);
return 0;
}
int comb(int a, int b)
{
int res = (1LL * f[a] * inv_mod(f[b])) % MOD;
res = (1LL * res * inv_mod(f[a - b])) % MOD;
return res;
}
int inv_mod(int x)
{
return power(x, MOD - 2);
}
int power(int base, int exp)
{
int res;
for (res = 1; exp; exp >>= 1)
{
if (exp & 1) res = (1LL * res * base) % MOD;
base = (1LL * base * base) % MOD;
}
return res;
}
void read(int &n, int &m)
{
int a, b, c;
ifstream fin("padure2.in");
fin >> n >> m;
for (fin >> c; c; --c)
{
fin >> a >> b;
C.emplace_back(a, b);
}
sort(C.begin(), C.end());
fin.close();
}
void write(int ans)
{
ofstream fout("padure2.out");
fout << ans << '\n';
fout.close();
}