Pagini recente » Cod sursa (job #2340964) | Cod sursa (job #1894328) | preONI 2007, Runda 4, Clasa a 10-a | Cod sursa (job #1183353) | Cod sursa (job #1710484)
#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);
}
}
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;
}
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;
if(fac[i]<0)fac[i]+=MOD;
}
long long int sol, gg, h, q;
gg=fac[n+m-2];
h=invers(fac[n-1]);
q=invers(fac[m-1]);
sol=(((1LL*fac[n+m-2]*invers(fac[n-1]))%MOD)*invers(fac[m-1]))%MOD;
memset(cost, 0, 1010*sizeof(int));
long long int dist;
for(int i=0; i<ciup.size(); i++){
dist=((1LL*fac[ciup[i].first+ciup[i].second-2]*invers(fac[ciup[i].first-1]))%MOD*invers(fac[ciup[i].second-1]))%MOD;
if(dist<0)dist+=MOD;
dist-=cost[i];
sol=(sol-dist*((1LL*fac[n+m-ciup[i].first-ciup[i].second]*invers(fac[n-ciup[i].first]))%MOD*invers(fac[m-ciup[i].second]))%MOD)%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*((1LL*fac[ciup[j].first+ciup[j].second-ciup[i].first-ciup[i].second]*invers(fac[ciup[j].first-ciup[i].first]))%MOD)*invers(fac[ciup[j].second-ciup[i].second]))%MOD)%MOD)%MOD;
//??
}
}
if(sol<0)sol+=MOD;
g<<sol<<"\n";
f.close();
g.close();
return 0;
}