Cod sursa(job #1709120)

Utilizator UNIBUC_Echipa_LachetaBicsi Nitu Velea UNIBUC_Echipa_Lacheta Data 28 mai 2016 10:58:39
Problema Padure2 Scor 0
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.94 kb
#include <cassert>
#include <fstream>
#include <cstring>
#include <queue>
#include <algorithm>
#include <bitset>
#include <ctime>
#include <set>
#include <cmath>
#include <iomanip>
#include <map>
#include <stack>
#include <vector>
#include <bitset>

#include <fstream>

using namespace std;

#define FOR(i, a, n) for (int i = a; i <= n; ++i)
#define ROF(i, n, a) for (int i = n; i >= a; i--)
#define FIT(i, v) for (auto &i : v)
#define pb push_back
#define mp make_pair
#define mt make_touple
#define all(x) (x).begin(), (x).end()
#define fi first
#define se second
#define sz(x) ((int)(x).size())
typedef long long ll;
typedef pair<int,int> pii;
const int mod = 2000003;
ll powmod(ll a, ll b) {ll res=1; a %= mod; assert(b >= 0); for(; b; b >>= 1) {if (b & 1) res = res * a % mod; a = a * a % mod;} return res;}

const int N = 2000010;

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

long long fac[N], invfac[N];

long long comb(long long n, long long k) {
    return fac[n] * invfac[k] % mod * invfac[n-k] % mod;
}

void precalc() {
    fac[0] = 1;
    int maxv = 2000000;
    for (int i = 1; i <= maxv; ++i) {
        fac[i] = fac[i-1] * i % mod;
    }
    
    invfac[maxv] = powmod(fac[maxv], mod-2);
    for (int i = maxv-1; i >= 0; --i) {
        invfac[i] = invfac[i+1] * (i+1) % mod;
    }
}

int main() {
    precalc();
    int n, m, c;
    fin >> n >> m >> c;
    vector<pii> v;
    for (int i = 1; i <= c; ++i) {
        int x, y;
        fin >> x >> y;
        v.push_back({x, y});
    }
    v.push_back({n, m});
    
    sort(v.begin(), v.end());
    
    vector<ll> dp(v.size());
    for (int i = 0; i < v.size(); ++i) {
        dp[i] = comb(v[i].first + v[i].second - 2, v[i].first - 1);
        for (int j = 0; j < i; ++j) {
            dp[i] = (dp[i] - comb(v[i].first + v[i].second - v[j].first - v[j].second, v[i].first - v[j].first) * dp[j] % mod) % mod;
            if (dp[i] < 0)
                dp[i] += mod;
        }
    }
    fout << dp.back();
}