#include <stdio.h>
#define NMAX 50001
#define INFI 0x3f3f3f3f
struct coord
{
long long x, y;
};
coord A[NMAX+1],frm;
float MD_DR[NMAX+1],MD_ST[NMAX+1];
long i,n,dr,st,NR;
int POZITIE(long long x1, long long y1, long long x2, long long y2)
{
int POZ=0;
if (x2 > x1)
POZ=1;
else
if (x2 < x1)
POZ=0;
else
if (x2 == x1)
if (y2 > y1)
POZ=1;
else
if (y2 < y1)
POZ=0;
return POZ;
}
float PANTA(long long x1, long long y1, long long x2, long long y2)
{
float panta;
if (x2 - x1 != 0)
panta =(float) (y2-y1) / (x2-x1);
else panta=(float) INFI;
return panta;
}
void Qsort_DR(long li, long ls)
{
long i=li, j=ls;
float x = MD_DR[(li+ls)/2], y;
while (i<=j)
{
while (MD_DR[i]<x) i++;
while (MD_DR[j]>x) j--;
if (i<=j)
{
y=MD_DR[i]; MD_DR[i]=MD_DR[j]; MD_DR[j]=y;
i++; j--;
}
}
if (i<ls) Qsort_DR(i,ls);
if (li<j) Qsort_DR(li,j);
}
void Qsort_ST(long li, long ls)
{
long i=li, j=ls;
float x = MD_ST[(li+ls)/2], y;
while (i<=j)
{
while (MD_ST[i]<x) i++;
while (MD_ST[j]>x) j--;
if (i<=j)
{
y=MD_ST[i]; MD_ST[i]=MD_ST[j]; MD_ST[j]=y;
i++; j--;
}
}
if (i<ls) Qsort_ST(i,ls);
if (li<j) Qsort_ST(li,j);
}
int main()
{
freopen("pachete.in","r",stdin);
freopen("pachete.out","w",stdout);
scanf("%ld",&n);
scanf("%lld%lld",&frm.x,&frm.y);
dr=0; st=0;
for (i=1;i<=n;i++)
{
scanf("%lld%lld",&A[i].x,&A[i].y);
if (POZITIE(frm.x,frm.y,A[i].x,A[i].y)==1)
MD_DR[++dr]=(float) PANTA(frm.x,frm.y,A[i].x,A[i].y);
else
if (POZITIE(frm.x,frm.y,A[i].x,A[i].y)==0)
MD_ST[++st]=(float) PANTA(frm.x,frm.y,A[i].x,A[i].y);
}
Qsort_DR(1,dr);
Qsort_ST(1,st);
NR=n;
for (i=1;i<=dr-1;i++)
if (MD_DR[i] == MD_DR[i+1])
NR--;
for (i=1;i<=st-1;i++)
if (MD_ST[i] == MD_ST[i+1])
NR--;
printf("%ld",NR);
fclose(stdin);
fclose(stdout);
return 0;
}