Cod sursa(job #1710697)

Utilizator iulianrotaruRotaru Gheorghe-Iulian iulianrotaru Data 29 mai 2016 17:27:13
Problema Padure2 Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 0.86 kb
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define Xp 2000003
#define x first
#define y second
int h,w,n,i,j,b[1<<21],e[1<<21],d[1<<10];
pair <int,int> a[1<<10];
int c(int n,int m)
{
    return (ll)e[n+m]*b[m]%Xp*b[n]%Xp;
}
int main()
{
    freopen("padure2.in","r",stdin);
    freopen("padure2.out","w",stdout);
    scanf("%d%d%d",&h,&w,&n);
    e[1]=e[0]=b[0]=1;
    int m=h+w;
    for(i=2;i<=m;++i) e[i]=ll(Xp/i)*(Xp-e[Xp%i])%Xp;
    for(i=1;i<=m;++i) b[i]=(ll)b[i-1]*e[i]%Xp;
    for(i=2;i<=m;++i) e[i]=(ll)e[i-1]*i%Xp;
    for(i=1;i<=n;++i) scanf("%d%d",&a[i].x,&a[i].y);
    a[++n]={h,w};
    sort(a+1,a+n+1);
    for(i=1;i<=n;++i)
	{
  	  for(j=1;j<i;++j)
      	   	if(a[j].y<=a[i].y) d[i]=(-c(a[i].x-a[j].x,a[i].y-a[j].y)*ll(d[j])+d[i])%Xp;
   	  d[i]=(d[i]+c(a[i].x-1,a[i].y-1)+Xp)%Xp;
    }
    printf("%d",d[n]);
}