Cod sursa(job #1709468)

Utilizator UBB_HakunaMatataUBB Cozma Nechita Pop UBB_HakunaMatata Data 28 mai 2016 12:25:58
Problema Padure2 Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.76 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("padure2.in");
ofstream fout("padure2.out");
#define MAXK 1010
#define MAXN 1000010
#define MOD 2000003

int fact[2 * MAXN], ifact[2 * MAXN];

int pow(int a, int p)
{
    int rez = 1;
    while(p)
    {
        if(p & 1)
            rez = (1ll * rez * a) % MOD;
        p >>= 1;
        a = (1ll * a * a) % MOD;
    }
    return rez;
}

pair<int, int> a[MAXK];

inline bool cmp(pair<int, int> a, pair<int, int> b)
{
    if(a.first == b.first)
        return a.second > b.second;
    return a.first > b.first;
}

int comb(int n, int k)
{
    return 1ll * ((1ll * fact[n] * ifact[k]) % MOD) * ifact[n - k] % MOD;
}
int ans[MAXK];
int main()
{
    int n, m, k, i, j;
    fin >> n >> m;
    fin >> k;
    for(i = 1 ; i <= k ; i++)
    {
        fin >> a[i].first >> a[i].second;
    }
    ++k;
    a[k].first = a[k].second = 1;
    sort(a + 1, a + k + 1, cmp);
    fact[0] = 1;
    for(i = 1 ; i <= n + m ; i++)
    {
        fact[i] = (1ll * fact[i - 1] * i) % MOD;
        //cout << fact[i] << " ";
    }
    ifact[n + m] = pow(fact[n + m], MOD - 2);
    for(i = n + m - 1 ; i >= 0 ; i--)
    {
        ifact[i] = (1ll * ifact[i + 1] * (i + 1)) % MOD;
    }

    for(i = 1 ; i <= k ; i++)
    {
        ans[i] = comb(n - a[i].first + m - a[i].second, n - a[i].first);
        for(j = 1 ; j < i ; j++)
            if(a[j].first >= a[i].first && a[j].second >= a[i].second)
                ans[i] = (ans[i] -
                (
                 (1ll * ans[j] *
                  comb(a[j].first + a[j].second - a[i].first - a[i].second, a[j].first - a[i].first)
                  ) % MOD) + MOD) % MOD;
    }
    fout << ans[k] << "\n";
}