Pagini recente » Cod sursa (job #2915779) | Cod sursa (job #2465874) | Cod sursa (job #1720022) | Cod sursa (job #815012) | Cod sursa (job #1708644)
| Utilizator |
Paul Diac diac_paul |
Data |
27 mai 2016 18:11:52 |
| Problema |
Padure2 |
Scor |
Ascuns |
| Compilator |
cpp |
Status |
done |
| Runda |
|
Marime |
1.66 kb |
#include <fstream>
#include <algorithm>
#define Mod 666013
#define XMax 1001
#define NMax 1000010
#define ll long long
using namespace std;
ifstream fin("padure2.in");
ofstream fout("padure2.out");
struct Point{
ll l,c;
bool operator< (const Point a) const
{
return l+c<a.l+a.c;
}
};
Point points[XMax];
ll C[XMax];
ll fact[2*NMax];
ll n,m;
ll x;
void gcd(ll &x, ll &y, ll a, ll b)
{
if (!b)
x = 1, y = 0;
else
{
gcd(x, y, b, a % b);
ll aux = x;
x = y;
y = aux - y * (a / b);
}
}
ll f(ll l1,ll c1,ll l2,ll c2)
{
if(l1>l2 || c1>c2)
return 0;
if(l1==l2 || c1==c2)
return 1;
ll s=0;
s=fact[l2-l1+c2-c1];
ll inv = 0;
ll ins;
if(!(l2-l1>=Mod || c2-c1>=Mod))
{
gcd(inv,ins, fact[l2-l1]*fact[c2-c1], Mod);
if (inv <= 0)
inv +=Mod;
inv %=Mod;
s = (s * inv ) %Mod;
}
return s;
}
void think(ll pos)
{
C[pos]=f(1,1, points[pos].l, points[pos].c);
for(ll i=1;i<pos;i++)
{
C[pos] -= ( C[i] * f( points[i].l, points[i].c, points[pos].l, points[pos].c) ) % Mod;
if(C[pos]<0)
C[pos]+=Mod;
}
}
int main()
{
fin>>n>>m;
fact[1]=1;
for(ll i=2;i<Mod;i++)
fact[i]=(fact[i-1]*i)%Mod;
fin>>x;
for(ll i=1;i<=x;i++)
fin>>points[i].l>>points[i].c;
sort(points+1,points+1+x);
for(ll i=1;i<=x;i++)
think(i);
points[x+1].l=n;
points[x+1].c=m;
think(x+1);
fout<<C[x+1]<<'\n';
return 0;
}