Pagini recente » Cod sursa (job #2209454) | Cod sursa (job #831804) | Cod sursa (job #159193) | Cod sursa (job #3123709) | Cod sursa (job #1985491)
#include<iostream>
#include<fstream>
#include<vector>
#include<utility>
#include<algorithm>
#define NMAX 2000003
#define MOD 2000003
using namespace std;
ifstream fin("padure2.in");
ofstream fout("padure2.out");
long long f[NMAX];
long long d[1001];
vector<pair<int, int>> ciup;
class Comparator
{
public:
bool operator() ( pair<int, int> x1, pair<int, int> x2)
{
if (x1.first < x2.first) return true;
if (x1.first == x2.first) return x1.second < x2.second;
return false;
}
};
int N, M,C;
long long fast_exp(long long n, int p)
{
if (p == 1) return n % MOD ;
if (p == 0) return 1;
if (p % 2 == 0) return fast_exp((n*n)% MOD, p / 2) % MOD;
return (n* (fast_exp((n*n)%MOD,(p - 1) / 2) % MOD)) % MOD;
}
long long fact(int n)
{
if (n == 1 || n==0) return 1;
if (n == 3) return 6;
if (f[n] != 0 ) return f[n] % MOD;
f[n] = (n * (fact(n - 1) % MOD)) % MOD;
return f[n];
}
int funct(int x, int y, int i, int j)
{
int n = i - x;
int m = j - y;
long long f_1, f_2, f_3;
f_1 = fact(n + m);
f_2 = fact(n);
f_3 = fact(m);
f_3 = (f_3 * f_2) % MOD;
return (f_1 * ( fast_exp(f_3,MOD-2) ) %MOD ) % MOD;
}
void solve()
{
long long sol = funct(1, 1, N, M);
long long s_1, s_2;
ciup.push_back(make_pair(N, M));
for (int i = 0; i < ciup.size(); ++i)
{
d[i] = funct(1, 1, ciup[i].first, ciup[i].second) ;
for (int j = 0; j < i; ++j)
{
if (ciup[j].second <= ciup[i].second)
d[i] = d[i] - ((d[j] * funct(ciup[j].first, ciup[j].second,ciup[i].first, ciup[i].second))%MOD) ;
d[i] = (d[i] + MOD) % MOD;
}
}
fout << d[ciup.size()-1];
}
int main()
{
fin >> N >> M>>C;
int x, y;
for (int i = 0; i < C; ++i)
{
fin >> x >> y;
ciup.push_back ( std::make_pair(x, y) );
}
Comparator cmp;
sort(ciup.begin(), ciup.end(),cmp);
solve();
fin.close();
fout.close();
return 0;
}