Pagini recente » Cod sursa (job #1964351) | Cod sursa (job #1836672) | Cod sursa (job #2588256) | Cod sursa (job #3279876) | Cod sursa (job #1985497)
#include<iostream>
#include<fstream>
#include<vector>
#include<utility>
#include<algorithm>
#define NMAX 2000006
#define MOD 2000003
using namespace std;
ifstream fin("padure2.in");
ofstream fout("padure2.out");
long long f[NMAX];
long long d[1003];
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;
}
void fact(int n)
{
f[0] = 1;
f[1] = 1;
for (int i = 2; i <= n; ++i)
{
f[i] = ((i * f[i - 1]) % MOD);
}
}
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 = f[(n + m) % MOD];
f_2 = f[n];
f_3 = f[m];
f_3 = (f_3 * f_2) % MOD;
return (f_1 * ( fast_exp(f_3,MOD-2) ) %MOD ) % MOD;
}
void solve()
{
ciup.push_back(make_pair(N, M));
for (int i = 0; i <(int) 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);
fact(MOD);
solve();
fin.close();
fout.close();
return 0;
}