Cod sursa(job #2081057)

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

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

#define x first
#define y second

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

int n, m;

long long dp[CMAX + 2];
long long fact[2 * NMAX + 2];

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 < ciuperci.size(); i++)
    {
        long long x2 = ciuperci[i].x, y2 = ciuperci[i].y;

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

        for(int j = 0; j < i; j++)
        {
            long long  x1 = ciuperci[j].x, y1 = ciuperci[j].y;
            long long  ans = (1LL * dp[j] * comb(x2 - x1 + y2 - y1, x2 - x1)) % MOD;

            dp[i] = (dp[i] - ans + MOD) % MOD;
        }
    }

    out << dp[ciuperci.size() - 1] << '\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;
}