#include <bits/stdc++.h>
using namespace std;
struct Po {
  long double x, y;
} a[100010], qu;
struct Info {
  Po x;
  int we;
} b[100010];
struct Onfo {
  int ho, qi;
};
bool operator<(Onfo x, Onfo y) { return x.ho < y.ho; }
set<Onfo> s;
int m, n, nb, la[100010], f[100010];
int lo(int x) { return x & (-x); }
int que(int x) {
  int su = 0;
  for (int i = x; i; i -= lo(i)) su += f[i];
  return su;
}
void add(int x) {
  for (int i = x; i <= nb; i += lo(i)) f[i]++;
}
Po operator+(Po x, Po y) { return (Po){x.x + y.x, x.y + y.y}; }
Po operator-(Po x, Po y) { return (Po){x.x - y.x, x.y - y.y}; }
Po operator*(Po x, long double y) { return (Po){x.x * y, x.y * y}; }
Po operator/(Po x, long double y) { return (Po){x.x / y, x.y / y}; }
long double operator^(Po x, Po y) { return x.x * y.x + x.y * y.y; }
long double operator*(Po x, Po y) { return x.x * y.y - x.y * y.x; }
long double dis2(Po x) { return x.x * x.x + x.y * x.y; }
long double dis(Po x) { return sqrt(dis2(x)); }
bool xiang(Po x) { return (x.x > 0 || (x.x == 0 && x.y > 0)); }
bool c1(const Info &x, const Info &y) {
  if (xiang(x.x) != xiang(y.x)) return xiang(x.x) < xiang(y.x);
  return (x.x * y.x >= 0);
}
long double cr(Po p1, Po p2, Po q1, Po q2) {
  long double s1 = (q1 - p1) * (p2 - p1), s2 = (p2 - p1) * (q2 - p1);
  Po ans = q1 + (q2 - q1) / (s1 + s2) * s1;
  return dis(ans);
}
int ch(long double x) {
  nb = 0;
  memset(la, 0, sizeof(la));
  memset(f, 0, sizeof(f));
  for (int i = 1; i <= n; i++) {
    Po p = (Po){0, a[i].y}, q = (Po){1, a[i].x + a[i].y};
    long double y = (p - q) ^ (qu - q) / dis(p - q);
    Po zh = q + (p - q) / dis(p - q) * y;
    if (dis(zh - qu) < x) {
      long double d1 = sqrt(x * x - dis2(zh - qu));
      b[++nb].x = q + (p - q) / dis(p - q) * (y - d1) - qu;
      b[nb].we = i;
      b[++nb].x = q + (p - q) / dis(p - q) * (y + d1) - qu;
      b[nb].we = i;
    }
  }
  sort(b + 1, b + nb + 1, c1);
  for (int i = 1; i <= nb; i++) la[b[i].we] = i;
  int sum = 0;
  for (int i = 1; i <= nb; i++) {
    if (la[b[i].we] != i) sum += que(la[b[i].we]) - que(i), add(la[b[i].we]);
  }
  return sum;
}
void getans(long double x) {
  nb = 0;
  memset(la, 0, sizeof(la));
  memset(f, 0, sizeof(f));
  for (int i = 1; i <= n; i++) {
    Po p = (Po){0, a[i].y}, q = (Po){1, a[i].x + a[i].y};
    long double y = (p - q) ^ (qu - q) / dis(p - q);
    Po zh = q + (p - q) / dis(p - q) * y;
    if (dis(zh - qu) < x) {
      long double d1 = sqrt(x * x - dis2(zh - qu));
      b[++nb].x = q + (p - q) / dis(p - q) * (y - d1) - qu;
      b[nb].we = i;
      b[++nb].x = q + (p - q) / dis(p - q) * (y + d1) - qu;
      b[nb].we = i;
    }
  }
  sort(b + 1, b + nb + 1, c1);
  for (int i = 1; i <= nb; i++) la[b[i].we] = i;
  long double ans = 0;
  int su = 0;
  for (int i = 1; i <= nb; i++) {
    if (la[b[i].we] != i) {
      auto j = s.upper_bound((Onfo){i, 0});
      while (j != s.end() && (*j).ho < la[b[i].we]) {
        su++;
        ans += cr(b[(*j).ho].x, b[(*j).qi].x, b[i].x, b[la[b[i].we]].x);
        j++;
      }
      s.insert((Onfo){la[b[i].we], i});
    }
  }
  ans += (m - su) * x;
  printf("%.10Lf\n", ans);
}
int main() {
  cin >> n;
  cin >> qu.x >> qu.y >> m;
  qu.x /= 1000, qu.y /= 1000;
  for (int i = 1; i <= n; i++) {
    cin >> a[i].x >> a[i].y;
    a[i].x /= 1000;
    a[i].y /= 1000;
  }
  long double l = 0, r = 1e18, mid;
  while (l + 1e-10 < r) {
    mid = (l + r) / 2;
    if (ch(mid) < m)
      l = mid;
    else
      r = mid;
  }
  getans(l);
  return 0;
}
