Cod sursa(job #2720482)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 10 martie 2021 21:29:57
Problema Padure2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva ICPC Marime 1.48 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[n+m] = lg_put (fact[n+m],MOD-2);
    for (i=n+m-1;i;i--)
        inv[i] = 1LL * inv[i+1] * (i+1) % MOD;

    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;
}