#include <bits/stdc++.h>
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;
  }
  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;
}
