Pagini recente » Concursuri organizate de infoarena | Cod sursa (job #1244846) | Cod sursa (job #3248032) | Concursuri organizate de infoarena | Cod sursa (job #1710596)
#include <fstream>
#include <iostream>
#include <string.h>
#define MOD 2000003
#include<vector>
#include<map>
using namespace std;
map<int, int> inv;
int fac[2000100];
int cost[1010];
ifstream f("padure2.in");
ofstream g("padure2.out");
void gcd(int &x, int &y, int a, int b)
{
if (!b)
x = 1, y = 0;
else
{
gcd(x, y, b, a % b);
int aux = x;
x = y;
y = (aux - y * (a / b))%MOD;
}
}
int invers(int n){
if(inv.find(n)!=inv.end()){
return inv[n];
}
int sol, x;
gcd(sol, x, n, MOD);
if(sol<MOD)sol+=MOD;
inv[n]=sol;
return sol;
}
long long comb(int xs, int ys, int xf, int yf){
if(xf<xs || yf<ys){
return 0;
}
long long int sol;
sol=((1LL*fac[xf+yf-xs-ys]*invers(fac[xf-xs]))%MOD*invers(fac[yf-ys]))%MOD;
if(sol<0)sol+=MOD;
return sol;
}
int main()
{
int i, x, y;
int n, m, c;
vector<pair<int, int> > ciup;
f>>n>>m>>c;
for(i=0; i<c; i++)
{
f>>x>>y;
ciup.push_back(pair<int, int>(x, y));
}
fac[0]=1;
long long int w=1;
for(i=1; i<2000100; i++){
w=(w*i)%MOD;
fac[i]=w%MOD;
while(fac[i]<0)fac[i]+=MOD;
}
long long int sol, aa, bvb, cc;
aa=fac[n+m-2];
bvb=invers(fac[n-1]);
cc=invers(fac[m-1]);
//cout<<aa<<" "<<bvb<<" "<<cc;
sol=comb(1, 1, n, m);
memset(cost, 0, 1010*sizeof(int));
long long int dist;
for(int i=0; i<ciup.size(); i++){
dist=comb(1, 1, ciup[i].first, ciup[i].second);
if(dist<0)dist+=MOD;
dist-=cost[i];
sol=(sol-dist*comb(ciup[i].first, ciup[i].second, n, m))%MOD;
for(int j=i+1; j<ciup.size(); j++){
//if(!(ciup[j].first<ciup[i].first || ciup[j].second<ciup[i].second))
cost[j]=(cost[j]+((dist*comb(ciup[i].first, ciup[i].second, ciup[j].first, ciup[j].second))%MOD))%MOD;
//??
}
}
if(sol<0)sol+=MOD;
g<<sol<<"\n";
f.close();
g.close();
return 0;
}