Cod sursa(job #2081028)

Utilizator PondorastiAlex Turcanu Pondorasti Data 3 decembrie 2017 20:03:25
Problema Padure2 Scor 0
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.75 kb
#include <fstream>
#include <algorithm>

using namespace std;

const int CMAX = 1e3, MOD = 2e6 + 3, NMAX = 1e6;
int n, m, nrC;
int dp[CMAX + 5], fact[2 * NMAX + 5];

struct Ciuperci {
    int x, y;
    
    bool operator < (const Ciuperci &aux) const {
        if (x != aux.x)
            return x < aux.x;
        else
            return y < aux.y;
    }
    
    int operator - (const Ciuperci &aux) const {
        return x - aux.x + y - aux.y;
    }
    
}ciupercute[CMAX + 2];

int Power(int a, int b) {
    int ans = 1;
    while (b) {
        if(b % 2 == 0) {
            a = (1LL * a * a) % MOD;
            b /= 2;
        } else {
            ans = (1LL * ans * a) % MOD;
            --b;
        }
    }
    return ans;
}

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

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

int main() {
    precalculare();
    
    ifstream cin("padure2.in");
    ofstream cout("padure2.out");
    
    cin >> n >> m >> nrC;
    
    for (int i = 1; i <= nrC; ++i) {
        cin >> ciupercute[i].x >> ciupercute[i].y;
    }
    
    sort(ciupercute + 1, ciupercute + 1 + nrC);
    
    ciupercute[++nrC].x = n;
    ciupercute[nrC].y = m;
    
    for (int i = 1; i <= nrC; ++i) {
        dp[i] = combinationsCalculator(ciupercute[i].x + ciupercute[i].y - 2, ciupercute[i].x - 1);
        for (int j = 1; j < i; ++j)
            //if(ciupercute[j].y <= ciupercute[i].y)
            dp[i] = (dp[i] - 1LL * dp[j] * combinationsCalculator(ciupercute[i] - ciupercute[j], ciupercute[i].x - ciupercute[j].x) % MOD + MOD) % MOD;
    }
    
    cout << dp[nrC];
    
    return 0;
}