Cod sursa(job #1712040)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 1 iunie 2016 20:46:55
Problema Padure2 Scor 0
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.41 kb
#include <cstdio>
#include <algorithm>
#define MAXC 1000
#define MOD 2000003LL
#define MAXN 1000000
using namespace std;
long long fact[2*MAXN+1];
struct Ciuperca{
    int lin,col;
};
Ciuperca C[MAXC+1];
long long dp[MAXC+1];
inline long long put(long long a){
     int b=MOD-2;
     long long rez=1;
     while(b>0){
          if(b&1)
             rez=(rez*a)%MOD;
          b>>=1;
          a=(a*a)%MOD;
     }
     return rez;
}
inline long long solve(int lin,int col){
     lin--;
     col--;
     return (fact[lin+col]*put((fact[lin]*fact[col])%MOD))%MOD;
}
bool cmp(Ciuperca a,Ciuperca b){
     if(a.lin==b.lin)
        return a.col<b.col;
     return a.lin<b.lin;
}
int main(){
   FILE*fi,*fout;
   int n,m,c,i,j;
   long long rez;
   fi=fopen("padure2.in" ,"r");
   fout=fopen("padure2.out" ,"w");
   fscanf(fi,"%d%d%d" ,&n,&m,&c);
   fact[0]=1;
   for(i=1;i<=n+m;i++)
      fact[i]=(fact[i-1]*i)%MOD;
   for(i=1;i<=c;i++)
      fscanf(fi,"%d%d" ,&C[i].lin,&C[i].col);
   sort(C+1,C+c+1,cmp);
   dp[1]=solve(C[1].lin,C[1].col);
   for(i=2;i<=c;i++){
       dp[i]=solve(C[i].lin,C[i].col);
       for(j=i-1;j>0;j--){
          dp[i]-=dp[j];
          dp[i]=(dp[i]+MOD)%MOD;
       }
   }
   rez=solve(n,m);
   for(i=1;i<=c;i++){
      rez-=(dp[i]*solve(n-C[i].lin+1,m-C[i].col+1))%MOD;
      rez=(rez+MOD)%MOD;
   }
   if(rez%2==1)
      rez+=MOD;
   fprintf(fout,"%lld" ,(rez/2)%MOD);
   fclose(fi);
   fclose(fout);
   return 0;
}