Cod sursa(job #2720478)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 10 martie 2021 21:27:38
Problema Padure2 Scor 0
Compilator cpp-64 Status done
Runda Arhiva ICPC Marime 1.42 kb
#include <bits/stdc++.h>
#define DIM 2000010
#define MOD 2000003
using namespace std;

int fact[DIM],inv[DIM],dp[DIM];
pair <int,int> v[DIM];
int n,m,k,i,j;

int lg_put (int a, int b){
    if (!b)
        return 1;
    int nr = lg_put (a,b/2);
    if (b%2)
        return 1LL * nr * nr % MOD * a % MOD;
    else return 1LL * nr * nr % MOD;
}

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

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

int solve (int x, int y, int x2, int y2){
    return comb(x2-x + y2-y,x2-x);
}

int main (){

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

    cin>>n>>m>>k;
    for (i=1;i<=k;i++)
        cin>>v[i].first>>v[i].second;

    v[++k] = make_pair(n,m);

    sort (v+1,v+k+1,cmp);

    fact[0] = inv[0] = 1;
    for (i=1;i<=n+m;i++){
        fact[i] = 1LL * fact[i-1] * i % MOD;
        inv[i] = lg_put (fact[i],MOD-2);
    }

    for (i=1;i<=k;i++){
        dp[i] = solve (1,1,v[i].first,v[i].second);
        for (j=1;j<i;j++){
            if (v[j].first <= v[i].first && v[j].second <= v[i].second){
                dp[i] = (dp[i] - 1LL * dp[j] * solve(v[j].first,v[j].second,v[i].first,v[i].second) % MOD) % MOD;
                if (dp[i] < 0)
                    dp[i] += MOD;
            }}}

    cout<<dp[k];


    return 0;
}