Cod sursa(job #2435333)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 3 iulie 2019 17:54:07
Problema Padure2 Scor 0
Compilator cpp-64 Status done
Runda Arhiva ICPC Marime 1.6 kb
#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 2000005
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
 */