#include <bits/stdc++.h>
using namespace std;
using ld = long double;
const ld PI = acosl(-1);
int k, n;
ld s, t;
vector<pair<ld, ld>> a;
ld dist(ld x, ld y) {
return sqrtl(x*x + y*y);
}
bool check(ld cost) {
// binary search on radius r
ld lo = 0, hi = 2e9;
for (int it = 0; it < 40; it++) {
ld r = (lo + hi) / 2;
ld D;
if (s == 0) {
D = 1e18; // no restriction on center
} else {
D = (cost - t * r) / s;
}
if (D < 0) {
lo = r;
continue;
}
vector<pair<ld,int>> ev;
for (auto &[x, y] : a) {
ld d = dist(x, y);
if (d > r + D) continue;
if (d < 1e-12) {
// star at origin → contributes full circle
ev.emplace_back(-PI, +1);
ev.emplace_back(PI, -1);
continue;
}
ld theta = atan2l(y, x);
ld val = (d*d + D*D - r*r) / (2*d*D);
if (val < -1) val = -1;
if (val > 1) val = 1;
ld alpha = acosl(val);
ld L = theta - alpha;
ld R = theta + alpha;
// normalize into [-PI, PI]
if (L < -PI) {
ev.emplace_back(L + 2*PI, +1);
ev.emplace_back(PI, -1);
ev.emplace_back(-PI, +1);
ev.emplace_back(R, -1);
} else if (R > PI) {
ev.emplace_back(L, +1);
ev.emplace_back(PI, -1);
ev.emplace_back(-PI, +1);
ev.emplace_back(R - 2*PI, -1);
} else {
ev.emplace_back(L, +1);
ev.emplace_back(R, -1);
}
}
sort(ev.begin(), ev.end());
int cur = 0, best = 0;
for (auto &[ang, type] : ev) {
cur += type;
best = max(best, cur);
}
if (best >= k) {
hi = r;
} else {
lo = r;
}
}
// final check using best r = hi
ld r = hi;
ld D;
if (s == 0) D = 1e18;
else D = (cost - t * r) / s;
if (D < 0) return false;
vector<pair<ld,int>> ev;
for (auto &[x, y] : a) {
ld d = dist(x, y);
if (d > r + D) continue;
if (d < 1e-12) {
ev.emplace_back(-PI, +1);
ev.emplace_back(PI, -1);
continue;
}
ld theta = atan2l(y, x);
ld val = (d*d + D*D - r*r) / (2*d*D);
val = max((ld)-1, min((ld)1, val));
ld alpha = acosl(val);
ld L = theta - alpha;
ld R = theta + alpha;
if (L < -PI) {
ev.emplace_back(L + 2*PI, +1);
ev.emplace_back(PI, -1);
ev.emplace_back(-PI, +1);
ev.emplace_back(R, -1);
} else if (R > PI) {
ev.emplace_back(L, +1);
ev.emplace_back(PI, -1);
ev.emplace_back(-PI, +1);
ev.emplace_back(R - 2*PI, -1);
} else {
ev.emplace_back(L, +1);
ev.emplace_back(R, -1);
}
}
sort(ev.begin(), ev.end());
int cur = 0;
for (auto &[ang, type] : ev) {
cur += type;
if (cur >= k) return true;
}
return false;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> k >> n >> s >> t;
a.resize(n);
for (int i = 0; i < n; i++) {
cin >> a[i].first >> a[i].second;
}
ld lo = 0, hi = 1e18;
for (int it = 0; it < 60; it++) {
ld mid = (lo + hi) / 2;
if (check(mid)) hi = mid;
else lo = mid;
}
cout << fixed << setprecision(10) << (double)hi << "\n";
}