Cod sursa(job #1857963)

Utilizator stelian2000Stelian Chichirim stelian2000 Data 26 ianuarie 2017 21:28:15
Problema Padure2 Scor 0
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.24 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const int mod=2000003;

struct punct
{
    int x,y;
};

punct v[1010];
int d[1010],fact[2000010];

int cmp(punct a,punct b)
{
    if(a.x==b.x) return a.y<b.y;
    else return a.x<b.x;
}

int rid_put(int a,int b)
{
    int sol=1;
    for(int i=1;i<=b;i<<=1)
    {
        if(b&i) sol=(1LL*sol*a)%mod;
        a=(1LL*a*a)%mod;
    }
    return sol;
}

int main()
{
    freopen("padure2.in","r",stdin);
    freopen("padure2.out","w",stdout);
    int n,m,c,a,b,c1;
    scanf("%d%d%d",&n,&m,&c);
    for(int i=1;i<=c;i++)
        scanf("%d%d",&v[i].x,&v[i].y);
    c++;
    fact[0]=1;
    for(int i=1;i<=n+m;i++)
        fact[i]=(1LL*fact[i-1]*i)%mod;
    v[c]={n,m};
    sort(v+1,v+c+1,cmp);
    for(int i=1;i<=c;i++)
    {
        a=(v[i].x-1)+(v[i].y-1);
        b=v[i].x-1;
        d[i]=(1LL*fact[a]*rid_put((1LL*fact[b]*fact[a-b])%mod,mod-2))%mod;
        for(int j=1;j<i;j++)
        {
            a=(v[i].x-v[j].x)+(v[i].y-v[j].y);
            b=v[i].x-v[j].x;
            c1=(1LL*fact[a]*rid_put((1LL*fact[b]*fact[a-b])%mod,mod-2))%mod;
            d[i]=(d[i]-(1LL*d[j]*c1)%mod+mod)%mod;
        }
    }
    printf("%d",d[c]);
    return 0;
}