Cod sursa(job #2081067)

Utilizator TudoseSanzianaTudose Sanziana TudoseSanziana Data 3 decembrie 2017 21:31:14
Problema Padure2 Scor 0
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.58 kb
#include <bits/stdc++.h>
using namespace std;

ifstream in("padure2.in");
ofstream out("padure2.out");

const int NMAX = 1e6, CMAX = 1e3, MOD = 2000003;

int n, m;

int dp[CMAX + 5];
int fact[2 * NMAX + 5];

int nc;
vector<pair<int, int>> ciuperci;

void factorial();
int exp(int b, int e);
int comb(int n, int k);

int main()
{
    factorial();

    in >> n >> m;
    in >> nc;
    for(int i = 1; i <= nc; i++)
    {
        int x, y;
        in >> x >> y;
        ciuperci.push_back({x, y});
    }
    ciuperci.push_back({n, m});

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

    for(int i = 0; i <= nc; i++)
    {
        int x2 = ciuperci[i].first, y2 = ciuperci[i].second;

        dp[i] = comb(x2 + y2 - 2, x2 - 1) % MOD;

        for(int j = 0; j < i; j++)
        {
            int  x1 = ciuperci[j].first, y1 = ciuperci[j].second;

            if(y1 <= y2)
            {
                int ans = (1LL * dp[j] * comb(x2 - x1 + y2 - y1, x2 - x1) % MOD + MOD) % MOD;
                dp[i] = (dp[i] - ans) % MOD;
            }
        }
    }

    out << dp[nc] << '\n';

    return 0;
}

void factorial()
{
    fact[0] = fact[1] = 1;
    for(int i = 2; i <= 2 * NMAX; i++)
        fact[i] = (1LL * fact[i - 1] * i) % MOD;
}

int exp(int b, int e)
{
    int ans;
    for(ans = 1; e; e >>= 1)
    {
        if(e & 1) ans = (1LL * ans * b) % MOD;
        b = (1LL * b * b) % MOD;
    }

    return ans;
}

int comb(int n, int k)
{
    return (1LL * fact[n] * exp(fact[k], MOD - 2) % MOD * exp(fact[n - k], MOD - 2) % MOD) % MOD;
}