Cod sursa(job #1709928)

Utilizator UAIC_The_RobotsUAIC-Tucar-Onesim-Vintur UAIC_The_Robots Data 28 mai 2016 14:28:27
Problema Padure2 Scor 0
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.83 kb
#include <iostream>
#include <fstream>
using namespace std;
#define Cmax 1001
#define Nmax 1000010
#define MOD 2000003

struct {int l, c;} v[Cmax];
int nr1[Nmax], nr2[Nmax];
int fact[Nmax];

int C(int, int);
int inv_mod(int);
int power(int, int);

int main()
{
    freopen("padure2.in", "r", stdin);
    freopen("padure2.out", "w", stdout);

    int i, j, n, m, k, res, aux;

    for(fact[0] = 1, i = 1; i < Nmax; ++i)
        fact[i] = (1LL * fact[i - 1] * i) % MOD;

    scanf("%d %d",&n,&m);
    scanf("%d",&k);
    for (int i=1;i<=k;i++){
        scanf("%d %d",&v[i].l,&v[i].c);
    }

    for(i = 1; i <= k; ++i)
        if((v[i].l == 1 && v[i].c == 1) || (v[i].l == n && v[i].c == m))
        {
            cout << 0 << '\n';
            return 0;
        }

    for(i = 1; i <= k; ++i)
    {
        nr1[i] = C(v[i].l + v[i].c - 2, v[i].l - 1);
        nr2[i] = C(m - v[i].l + n - v[i].c, m - v[i].c);
    }

    for(res = C(m + n - 2, m - 1), i = 1; i <= k; ++i)
    {
        for(aux = nr2[i], j = 1; j <= k; ++j)
            if(v[j].l >= v[i].l && v[j].c >= v[i].c && j != i)
        {
            aux -= (1LL * nr2[j] * C(v[j].l - v[i].l + v[j].c - v[i].c, v[j].l - v[i].l)) % MOD;
            if(aux < 0) aux += MOD;
        }

        res -= (1LL * nr1[i] * aux) % MOD;
        if(res < 0) res += MOD;
    }

    cout << res << '\n';

    return 0;
}

int C(int a, int b)
{
    int res = fact[a];

    res = (1LL * res * inv_mod(fact[b])) % MOD;
    res = (1LL * res * inv_mod(fact[a - b])) % MOD;

    return res;
}

int inv_mod(int x)
{
    return power(x, MOD - 2);
}

int power(int base, int exp)
{
    int res;

    for(res = 1; exp; exp >>= 1)
    {
        if(exp & 1) res = (1LL * res * base) % MOD;
        base = (1LL * base * base) % MOD;
    }

    return res;
}