Cod sursa(job #1710899)

Utilizator Alexa2001Alexa Tudose Alexa2001 Data 29 mai 2016 22:44:23
Problema Padure2 Scor 0
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.44 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const int Mod = 2000003;
const int N = 1005;

int n,m,c, x,y,z, pos[N], ans, i, j, fact[2*N*N], invfact[2*N*N];
pair<int,int> a[N];

int inv(int x, int y)
{
    if(!y) return 1;
    if(y&1) return (int)(1LL*x*inv((int)(1LL*x*x%Mod), y>>1)%Mod);
    return inv((int)(1LL*x*x%Mod), y>>1);
}

void Combo()
{
     int i;
     fact[0] = invfact[0] = 1;
     for(i=1; i<=n+m; ++i)
     {
          fact[i] = (int)(1LL*fact[i-1]*i%Mod);
          invfact[i] = inv(fact[i], Mod-2);
     }
}

int moove(int x, int y)
{
    return (int)(1LL*fact[x+y]*invfact[x]%Mod*invfact[y]%Mod);
}

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

    scanf("%d%d%d", &n, &m, &c);
    for(i=1; i<=c; ++i)
        scanf("%d%d", &a[i].first, &a[i].second);

    sort(a+1, a+c+1);
    Combo();

    ans = moove(n-1, m-1);

    for(i=1; i<=c; ++i)
    {
         pos[i] = moove(a[i].first-1, a[i].second-1);

         for(j=1; j<i; ++j)
            if(a[j].second<=a[i].second)
                pos[i] -= (int)(1LL*pos[j]*moove(a[i].first-a[j].first, a[i].second-a[j].second)%Mod);

         if(pos[i]<0)
            pos[i] = (pos[i]%Mod + Mod)%Mod;

         ans -= (int)(1LL*pos[i]*moove(n-a[i].first, m-a[i].second)%Mod);
    }

    if(ans<0)
        ans = (ans%Mod + Mod)%Mod;
    printf("%d\n", ans);

    return 0;
}