Cod sursa(job #1711072)

Utilizator Cristian1997Vintur Cristian Cristian1997 Data 30 mai 2016 13:32:29
Problema Padure2 Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.8 kb
using namespace std;
#include <fstream>
#include <vector>
#include <algorithm>
#include <string>
#define MOD 2000003
#define Vmax 2000002
#define Cmax 1010
using pii = pair<int, int>;

vector< pii > C;
int nrBad[Cmax], nrGood[Cmax];
int f[Vmax];

int comb(int, int);
int inv_mod(int);
int power(int, int);
void read(int&, int&);
void write(int);

int main()
{
	int i, j, n, m, a, b;

	for (f[0] = 1, i = 1; i < Vmax; ++i) f[i] = (1LL * f[i - 1] * i) % MOD;

	read(n, m);

	if (C.back() == make_pair(n, m))
	{
		write(0);
		return 0;
	}

	C.emplace_back(n, m);

	for (i = 0; i < C.size(); ++i)
	{
		nrBad[i] = 0;
		for (j = 0; j < i; ++j)
			if (C[j].first <= C[i].first && C[j].second <= C[i].second)
			{
				a = C[i].first - C[j].first + C[i].second - C[j].second;
				b = C[i].first - C[j].first;

				nrBad[i] += (1LL * nrGood[j] * comb(a, b)) % MOD;
				if (nrBad[i] >= MOD) nrBad[i] -= MOD;
			}

		nrGood[i] = comb(C[i].first + C[i].second - 2, C[i].first - 1) - nrBad[i];
		if (nrGood[i] < 0) nrGood[i] += MOD;
	}

	write(nrGood[C.size() - 1]);

    return 0;
}

int comb(int a, int b)
{
	int res = (1LL * f[a] * inv_mod(f[b])) % MOD;
	res = (1LL * res * inv_mod(f[a - b])) % MOD;

	return res;
}

int inv_mod(int x)
{
	return power(x, MOD - 2);
}

int power(int base, int exp)
{
	int res;

	for (res = 1; exp; exp >>= 1)
	{
		if (exp & 1) res = (1LL * res * base) % MOD;
		base = (1LL * base * base) % MOD;
	}

	return res;
}

void read(int &n, int &m)
{
	int a, b, c;
	ifstream fin("padure2.in");

	fin >> n >> m;
	for (fin >> c; c; --c)
	{
		fin >> a >> b;
		C.emplace_back(a, b);
	}

	sort(C.begin(), C.end());

	fin.close();
}

void write(int ans)
{
	ofstream fout("padure2.out");

	fout << ans << '\n';

	fout.close();
}