Pagini recente » Atasamentele paginii test123123123 | Concursuri Virtuale | Monitorul de evaluare | Atasamentele paginii sim1 | Cod sursa (job #2435331)
#include <bits/stdc++.h>
#define dbg(x) cerr<<#x<<" = "<<x<<endl;
#define dbg_v(v,n) {cerr<<#v<<" = [";for(int III=1;III<=n;III++)cerr<<v[III]<<(III!=n?",":"]\n");}
#define ll long long
#define ld long double
#define pii pair<int,int>
#define MOD 2000003
#define zeros(x) x&(x-1)^x
#define Nmax 1000005
using namespace std;
int h,w,n,p[Nmax],inv[Nmax];
struct ceva{
int x, y, val;
};
vector<ceva> v;
bool comp(ceva a,ceva b){
return a.x + a.y < b.x + b.y;
}
int _pow(int a,int b){
if (b==0) return 1;
if (b==1) return a;
if (b%2==0) return _pow(1LL * a * a % MOD, b/2);
return 1LL * _pow(1LL * a * a % MOD, b/2) * a % MOD;
}
int comb(int n,int m){
return 1LL * p[n] * inv[m] % MOD * inv[n-m] % MOD;
}
int add(int a, int b){
a += b;
if (a >= MOD) a -= MOD;
if (a < 0) a += MOD;
return a;
}
int getVal(int x,int y){
return comb(x+y-2, x-1);
}
int main(){
freopen("padure2.in","r",stdin);
freopen("padure2.out","w",stdout);
ios::sync_with_stdio(false);
cin >> h >> w >> n;
p[0] = inv[0] = 1;
for (int i=1;i<=1e5;i++){
p[i] = 1LL * p[i-1] * i % MOD;
inv[i] = _pow(p[i], MOD-2);
}
for (int i=1;i<=n;i++){
int x,y;
cin >> x >> y;
v.push_back({x,y,0});
}
v.push_back({1,1,1});
v.push_back({h,w,0});
sort(v.begin(),v.end(),comp);
for (int i=1;i<v.size();i++) v[i].val = getVal(v[i].x, v[i].y);
for (int i=1;i+1<v.size();i++){
for (int j=i+1;j<v.size();j++){
if (v[j].x >= v[i].x && v[j].y >= v[i].y){
v[j].val = add(v[j].val, -1LL * v[i].val * getVal(v[j].x - v[i].x + 1, v[j].y - v[i].y + 1)%MOD);
}
}
}
cout << v[v.size()-1].val << '\n';
return 0;
}
/*
5 5 3
2 3
3 2
4 4
*/