#include <algorithm>
#include <cmath>
#include <iomanip>
#include <iostream>
#include <vector>
using namespace std;
const int maxn = 5e4 + 5;
const long double pi = acos((long double)(-1));
int n, m, beg[maxn], fen[2 * maxn], pos[maxn][2], prv[2 * maxn], nxt[2 * maxn];
long double x, y, a[maxn], b[maxn];
vector<pair<long double, int> > circx, span;
void computeCircleIntersections(long double r) {
circx.clear();
for (int i = 0; i < n; i++) {
long double ca = a[i], cb = b[i];
long double discrim = ca * ca * r * r - cb * cb + r * r;
if (discrim > 0) {
long double sq = sqrt(discrim);
long double x1 = (-sq - ca * cb) / (ca * ca + 1);
long double x2 = ( sq - ca * cb) / (ca * ca + 1);
long double y1 = ca * x1 + cb, y2 = ca * x2 + cb;
long double a1 = atan2(y1, x1), a2 = atan2(y2, x2);
circx.push_back(make_pair(a1, i));
circx.push_back(make_pair(a2, i));
}
}
sort(circx.begin(), circx.end());
}
void add(int idx, int d) {
++idx;
while (idx < 2 * maxn) {
fen[idx] += d;
idx += (idx & -idx);
}
}
int sum(int idx) {
++idx;
int ret = 0;
while (idx > 0) {
ret += fen[idx];
idx -= (idx & -idx);
}
return ret;
}
long long countCircleIntersections() {
long long ret = 0;
for (int i = 0, tot = 0; i < circx.size(); i++) {
int idx = circx[i].second;
if (beg[idx] == -1) {
++tot;
beg[idx] = i;
add(i, 1);
} else {
--tot;
add(beg[idx], -1);
ret += tot - sum(beg[idx]);
beg[idx] = -1;
}
}
return ret;
}
void initCyclicList() {
for (int i = 0; i < circx.size(); i++) {
prv[i] = (i + circx.size() - 1) % circx.size();
nxt[i] = (i + 1) % circx.size();
}
}
void deleteCyclicListElement(int idx) {
int pidx = prv[idx];
int nidx = nxt[idx];
prv[nidx] = pidx;
nxt[pidx] = nidx;
}
long double intersectionDistance(int idx1, int idx2) {
--m;
long double ix = (b[idx1] - b[idx2]) / (a[idx2] - a[idx1]);
long double iy = a[idx1] * ix + b[idx1];
long double dist = sqrt(ix * ix + iy * iy);
return dist;
}
long double sumCyclicList(int start, int end, int *it) {
long double sum = 0;
for (int idx = it[start]; idx != end; idx = it[idx]) {
sum += intersectionDistance(circx[start].second, circx[idx].second);
}
return sum;
}
long double sumCircleIntersections(long double r) {
computeCircleIntersections(r);
if (countCircleIntersections() > m) {
return 0; //degenerate case: a lot of intersections on query point
}
for (int i = 0; i < circx.size(); i++) {
int idx = circx[i].second;
if (beg[idx] == -1) {
beg[idx] = i;
pos[idx][0] = i;
} else {
pos[idx][1] = i;
long double sp = circx[i].first - circx[beg[idx]].first;
if (2 * pi - sp < sp) {
sp = 2 * pi - sp;
int tmp = pos[idx][0];
pos[idx][0] = pos[idx][1];
pos[idx][1] = tmp;
}
span.push_back(make_pair(sp, idx));
}
}
sort(span.begin(), span.end());
initCyclicList();
long double sum = 0;
for (int i = 0; i < span.size(); i++) {
int idx = span[i].second;
if (pos[idx][0] < pos[idx][1]) {
sum += sumCyclicList(pos[idx][0], pos[idx][1], nxt);
} else {
sum += sumCyclicList(pos[idx][0], pos[idx][1], nxt);
}
deleteCyclicListElement(pos[idx][0]);
deleteCyclicListElement(pos[idx][1]);
}
return sum + m * r;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(NULL);
cin >> n >> x >> y >> m;
x /= 1000, y /= 1000;
for (int i = 0; i < n; i++) {
cin >> a[i] >> b[i];
a[i] /= 1000, b[i] /= 1000;
b[i] += a[i] * x - y;
}
fill_n(beg, maxn, -1);
long double low = 0, high = 1e10;
for (int i = 0; i < 70; i++) {
long double mid = (low + high) / 2;
computeCircleIntersections(mid);
if (countCircleIntersections() < m) {
low = mid;
} else {
high = mid;
}
}
cout << fixed << setprecision(9) << sumCircleIntersections(low) << '\n';
return 0;
}