#include<iostream>
#include<cmath>
using namespace std;
struct point{
int x;
int y;
};
struct myvector{
int a;
int b;
};
int semix,semiy;
int num,initm;
double radius;
point points[160];
myvector v[160];
int cal(int m,int n)
{
return m*m+n*n;
}
void foredeal()
{
int n=0;
int i;
for(i=0;i<num;i++){
int temp=cal(v[i].a,v[i].b);
if(temp<=radius*radius){
v[n].a=v[i].a;
v[n].b=v[i].b;
n++;
}
}
num=n;
}
void initmax()
{
//这里处在边界的要另外算,不能一开始的时候就与某个部分合并,否则答案会出错
double k;
int n1=0;
int n2=0;
int n=1;
if(v[0].a!=0){
k=((double)v[0].b)/v[0].a;
for(int i=1;i<num;i++){
if(k*v[i].a-v[i].b<0)
n1++;
else if(k*v[i].a-v[i].b>0)
n2++;
else
n++;
}
}
else{
for(int i=1;i<num;i++){
if(v[i].a<0)
n1++;
else if(v[i].a>0)
n2++;
else
n++;
}
}
initm=(n1+n)>(n2+n)? (n1+n):(n2+n);
}
void findmax(int j)
{
double k;
int n1=0;
int n2=0;
int n=1;
if(v[j].a!=0){
k=((double)v[j].b)/v[j].a;
for(int i=0;i<num;i++){
if(i!=j){
if(k*v[i].a-v[i].b<0)
n1++;
else if(k*v[i].a-v[i].b>0)
n2++;
else
n++;
}
}
}
else{
for(int i=0;i<num;i++){
if(i!=j){
if(v[i].a<0)
n1++;
else if(v[i].a>0)
n2++;
else
n++;
}
}
}
int temp=(n1+n)>(n2+n)? (n1+n):(n2+n);
if(temp>initm)
initm=temp;
}
int main()
{
int i;
while(cin>>semix>>semiy>>radius && semix>=0 && radius>=0 && semiy>=0){
cin>>num;
for(i=0;i<num;i++){
cin>>points[i].x>>points[i].y;
}
for(i=0;i<num;i++){
v[i].a=points[i].x-semix;
v[i].b=points[i].y-semiy;
}
foredeal();
if(num!=0){
initmax();
for(i=1;i<num;i++){
findmax(i);
}
cout<<initm<<endl;
}
else{
cout<<0<<endl;
}
}
return 0;
}