Cod sursa(job #1709946)

Utilizator DEFINEtelyEngineersUPB Pirtoaca Vasilescu Zamfiratos DEFINEtelyEngineers Data 28 mai 2016 14:33:01
Problema Padure2 Scor 0
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.3 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

#define NMAX 2000001
#define KMAX 1001
#define MOD 2000003

vector < pair <int, int> > v;

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;
		v.push_back(make_pair(x,y));
	}
	f.close();
	v.push_back(make_pair(n,m));
	sort(v.begin(), v.end());
	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] << '\n';
	g.close();
	return 0;
}