Cod sursa(job #1709421)

Utilizator TeamFIIBUAIC NoReturnValue TeamFIIB Data 28 mai 2016 12:11:04
Problema Padure2 Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.49 kb
#include <iostream>
#include<vector>
#include<fstream>
#include<utility>
#include<algorithm>
using namespace std;

typedef struct { int x, y; } celula;

long long fact[2000006];
long long mod=2000003;
long long n,m,k,i,j;
long long dp[1005];
celula c[1005];

long long putere(long long a, long long b) {
	
	long long rez=1;
	
	while (b>0)
	 if (b%2==0) { a*=a; a%=mod; b/=2; }
	 else { rez*=a; rez%=mod; --b; }
	 
	return rez;
	
}

long long comb(long long n, long long k) {
	
	long long sus=fact[n];
	sus*=putere(fact[n-k],mod-2);
	sus%=mod;
	sus*=putere(fact[k],mod-2);
	sus%=mod;
	
	return sus;
	
}

long long solve(long long i, long long j) {

	return comb(i+j-2,j-1);
	
}

bool cmp(celula a, celula b) {
	
	if (a.x==b.x) return a.y<b.y;
	return a.x<b.x;
	
}

int main() {
	
	ifstream cin("padure2.in");
	ofstream cout("padure2.out");
	
	fact[0]=1;
	
	for (i=1; i<=2000000; ++i) {
	  fact[i]=i*fact[i-1];
	   fact[i]%=mod;
	}
	
	//
	
	cin>>n>>m>>k;
	
	for (i=1; i<=k; ++i) cin>>c[i].x>>c[i].y;
	
	sort(c+1,c+k+1,cmp);
	
	if (c[k].x==n && c[k].y==m) {
	  cout<<"0";
	  return 0;
	}
	else {
		++k;
		c[k].x=n;
		c[k].y=m;
	}
	
	//
	
	for (i=1; i<=k; ++i) {
		
		dp[i]=solve(c[i].x,c[i].y);
		
		for (j=i-1; j>=1; --j)
		 if (c[j].y<=c[i].y) {
		   long long aux=dp[j]*solve(c[i].x-c[j].x+1,c[i].y-c[j].y+1);
		   aux%=mod;
		   
		   dp[i]-=aux;
		   if (dp[i]<0) dp[i]+=mod;

		}
		
		
	}
	
	cout<<dp[k];

	return 0;
}