Cod sursa(job #2738170)

Utilizator Stefan_PiscuPiscu Stefan Constantin Stefan_Piscu Data 5 aprilie 2021 15:31:42
Problema Padure2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva ICPC Marime 1.25 kb
#include <bits/stdc++.h>
using namespace std;

#define cin fin
#define cout fout
ifstream cin("padure2.in");
ofstream cout("padure2.out");

#define MOD 2000003

struct Math{
	int N;
	vector<int> fact;
	vector<int> inv;

	int binpow(int b, int e){
		int sol=1;
		while(e){
			if(e&1) sol=(1ll*sol*b)%MOD;
			b=(1ll*b*b)%MOD;
			e>>=1;
		}
		return sol;
	}

	Math(int N): N(N+1){
		fact.resize(N+1);
		inv.resize(N+1);
		fact[0]=1;
		for(int i=1;i<=N;++i) fact[i]=(1LL*fact[i-1])*i%MOD;
		inv[N]=binpow(fact[N], MOD-2);
		for(int i=N-1;i;i--) inv[i]=(1ll*inv[i+1]*(i+1))%MOD;
	}

	int comb(int n, int k){
		if(n==0||k==0||n==k) return 1;
		return 1LL*(1LL*fact[n]*inv[k]%MOD)*inv[n-k]%MOD;
	}

};

int dp[1002];
vector<pair<int, int>> c;

int main(){
	int n, m;
	int nrc;
	cin>>n>>m>>nrc;
	nrc++;
	Math math(n+m);
	c.resize(nrc+1);
	for(int i=1;i<nrc;++i){
		cin>>c[i].first>>c[i].second;
	}
	c[nrc]=make_pair(n, m);
	sort(c.begin()+1, c.end());
	for(int i=1;i<=nrc;++i){
		dp[i]=math.comb(c[i].first-1+c[i].second-1, c[i].first-1);
		for(int j=1;j<i;++j){
			if((c[j].first>c[i].first)||(c[j].second>c[i].second)) continue;
			dp[i]=(dp[i]+MOD-((1LL*dp[j]*math.comb(c[i].first-c[j].first+c[i].second-c[j].second, c[i].first-c[j].first)%MOD)))%MOD;
		}
	}
	cout<<dp[nrc]<<"\n";
}