#include using namespace std; typedef long double T; struct Vec { T x, y; }; Vec operator+ (Vec a, Vec b) { return { a.x + b.x, a.y + b.y }; } Vec operator- (Vec a, Vec b) { return { a.x - b.x, a.y - b.y }; } Vec operator* (Vec a, T b) { return { a.x * b, a.y * b }; } Vec operator/ (Vec a, T b) { return { a.x / b, a.y / b }; } T dot(Vec a, Vec b) { return a.x * b.x + a.y * b.y; } T prod(Vec a, Vec b) { return a.x * b.y - a.y * b.x; } T len(Vec v) { return sqrt(dot(v, v)); } T len2(Vec v) { return dot(v, v); } struct ParamLine { Vec p, v; ParamLine() = default; ParamLine(Vec a, Vec b) { p = a; v = b - a; } }; Vec project(const ParamLine &l, const Vec &u) { return l.p + l.v * dot((u - l.p), l.v) / len2(l.v); } T dist(const ParamLine &l, const Vec &u) { return abs(prod(l.v, u - l.p) / len(l.v)); } struct Circle { Vec o; T r; }; pair intersect(Circle c, ParamLine l) { Vec pr = project(l, c.o); T t = sqrt(c.r * c.r - len2(pr - c.o)); Vec v = l.v / len(l.v); return { pr + v * t, pr - v * t }; } int main() { int n, R, a, b; scanf("%d %d %d %d", &n, &R, &a, &b); T r = R + 1e-9; Vec v { a, b }; ParamLine l({ 0, 0 }, v); vector> segs; for(int i = 0; i < n; i++) { int x, y; scanf("%d %d", &x, &y); Vec u { x, y }; if(dist(l, u) > r) continue; Circle c { u, r }; auto in = intersect(c, l); segs.emplace_back(dot(in.first, v), dot(in.second, v)); } vector> vec; for(auto s: segs) { auto a = s.first, b = s.second; if(a > b) swap(a, b); vec.emplace_back(a, +1); vec.emplace_back(b, -1); } sort(vec.begin(), vec.end()); int ans = 0, bal = 0; for(auto p: vec) { bal += p.second; ans = max(ans, bal); } printf("%d\n", ans); }