Pagini recente » Cod sursa (job #903899) | Cod sursa (job #557753) | Cod sursa (job #1132280) | Cod sursa (job #2823636) | Cod sursa (job #1710005)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
#define NMAX 2000001
#define KMAX 1001
#define MOD 2000003
vector < pair <int, int> > v, a;
long long put(long long x, long long n)
{
if(n == 0)
return 1;
if(n % 2 == 0) {
long long aux = put(x, n/2);
return (1LL * aux * aux)%MOD;
}
return (1LL * x * put(x, n - 1))%MOD;
}
long long cnt[NMAX],fact[NMAX],inv[NMAX];
long long number(int l1, int c1, int l2, int c2)
{
int n = (l2 - l1);
int m = (c2 - c1);
return (1LL * ((1LL * fact[n + m] * inv[n])% MOD) * inv[m]) % MOD;
}
int main ()
{
int n,m,k,i,x,y,j;
ifstream f("padure2.in");
ofstream g("padure2.out");
f>>n>>m>>k;
for(i=1;i<=k;i++) {
f>>x>>y;
a.push_back(make_pair(x,y));
}
f.close();
a.push_back(make_pair(n,m));
sort(a.begin(), a.end());
for(i = 0; i <= k; i++) {
int ok = 1;
for(vector <pair <int, int> > :: iterator it = v.begin();it != v.end();it++)
if(*it == a[i]) {
ok = 0;
break;
}
if(ok)
v.push_back(a[i]);
}
k = v.size();
fact[0] = 1;
inv[0] = 1;
for(i = 1; i <= n + m; i++) {
fact[i] = (1LL * i * fact[i - 1])%MOD;
inv[i] = put(fact[i], MOD - 2)%MOD;
}
for(i = 0; i < k; i++) {
cnt[i] = number(1, 1, v[i].first, v[i].second);
for(j = 0; j < i; j++) {
if(v[j].first <= v[i].first && v[j].second <= v[i].second)
cnt[i] = (cnt[i] - 1LL * (number(v[j].first, v[j].second, v[i].first, v[i].second))*cnt[j] + MOD)%MOD;
}
}
g << cnt[k - 1] << '\n';
g.close();
return 0;
}