Cod sursa(job #1985491)

Utilizator StefanMudragMudrag Stefan StefanMudrag Data 27 mai 2017 23:40:25
Problema Padure2 Scor 0
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.89 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<utility>
#include<algorithm>

#define NMAX 2000003
#define MOD 2000003
using namespace std;

ifstream fin("padure2.in");
ofstream fout("padure2.out");
long long  f[NMAX];
long long d[1001];

vector<pair<int, int>> ciup;
class Comparator
{
public:
	bool operator() ( pair<int, int> x1,  pair<int, int> x2)
	{
		if (x1.first < x2.first) return true;
		if (x1.first == x2.first) return x1.second < x2.second;
		return false;
	}
};
int N, M,C;
long long fast_exp(long long n, int p)
{
	if (p == 1) return n % MOD ;
	if (p == 0) return 1;

	if (p % 2 == 0) return fast_exp((n*n)% MOD, p / 2) % MOD;
	return (n* (fast_exp((n*n)%MOD,(p - 1) / 2) % MOD)) % MOD;

}
long long  fact(int n)
{
	if (n == 1 || n==0) return 1;
	if (n == 3) return 6;
	if (f[n] != 0 ) return f[n] % MOD;
	f[n] = (n * (fact(n - 1) % MOD)) % MOD;

	return f[n];
}
int funct(int x, int y, int i, int j)
{
	int n = i - x;
	int m = j - y;
	long long  f_1, f_2, f_3;

	f_1 = fact(n + m);
	f_2 = fact(n);
	f_3 = fact(m);
	
	f_3 = (f_3 * f_2) % MOD;
	
	return (f_1 * ( fast_exp(f_3,MOD-2) ) %MOD ) % MOD;

}

void solve()
{
	long long sol = funct(1, 1, N, M);
	long long  s_1, s_2;
	ciup.push_back(make_pair(N, M));

	for (int i = 0; i < ciup.size(); ++i)
	{
		d[i] = funct(1, 1, ciup[i].first, ciup[i].second) ;
		for (int j = 0; j < i; ++j)
		{
			if (ciup[j].second <= ciup[i].second)
				d[i]  = d[i] - ((d[j] * funct(ciup[j].first, ciup[j].second,ciup[i].first, ciup[i].second))%MOD) ;

			d[i] = (d[i] + MOD) % MOD;
		}
	
	}

	fout << d[ciup.size()-1];
}
int main()
{

	fin >> N >> M>>C;
	int x, y;

	for (int i = 0; i < C; ++i)
	{
		fin >> x >> y;
		ciup.push_back ( std::make_pair(x, y) );
	}

	Comparator cmp;
	sort(ciup.begin(), ciup.end(),cmp);
	solve();

	fin.close();
	fout.close();
	

	return 0;
}