#include <bits/stdc++.h>   long double read() {     int x;     scanf( %d , &x);     return x / 1000.0L;   }   const long double eps = 1e-9, Eps = 1e-7;   const int N = 1e5 + 5, V = 4e7 + 5;   int n, m, q, rb[N], vol, stc[V];   std::pair<int, int> p[N];   long double k, ox, oy, a[N], b[N], cx[N], cy[N];   long double ans, dis[N], s[N], t[N], tb[N];   struct FenwickTree {     int f[N];     void reset(int n) { memset(f, 0, (n + 1) * 4); }     void modify(int u, int x) {       for (int i = u; i <= m; i += i & -i) {         f[i] += x;       }     }     int query(int u) {       int res = 0;       for (int i = u; i >= 1; i ^= i & -i) {         res += f[i];       }       return res;     }     int query(int l, int r) {       if (l >= r) {         return 0;       }       return query(r) - query(l);     }   } tr;   long double get(int i, int j) {     long double x = (b[i] - b[j]) / (a[j] - a[i]), y = a[i] * x + b[i];     return std::sqrt((x - ox) * (x - ox) + (y - oy) * (y - oy));   }   bool check(long double k, bool typ) {     int res = 0;     m = 0;     for (int i = 0; i < n; i++) {       long double x = cx[i] - ox, y = cy[i] - oy;       if (dis[i] > k * k - eps) {         continue;       }       if (std::abs(dis[i]) < eps) {         s[i] = std::atan2(a[i], 1);         t[i] = std::atan2(-a[i], -1);       } else {         long double z = std::sqrt(k * k / dis[i] - 1);         s[i] = std::atan2(y - x * z, x + y * z);         t[i] = std::atan2(y + x * z, x - y * z);       }       if (s[i] > t[i]) {         std::swap(s[i], t[i]);       }       s[i] += eps;       t[i] -= eps;       tb[m++] = s[i];       tb[m++] = t[i];     }     std::sort(tb, tb + m);     for (int i = 0; i < n; i++) {       if (dis[i] > k * k - eps) {         p[i] = {m, i};         continue;       }       p[i] = {std::upper_bound(tb, tb + m, s[i]) - tb - 1, i};       rb[i] = std::upper_bound(tb, tb + m, t[i]) - tb;     }     std::sort(p, p + n);     if (!typ) {       tr.reset(m);       for (int i = 0; i < n; i++) {         if (p[i].first == m) {           break;         }         res += tr.query(p[i].first, rb[p[i].second]);         tr.modify(rb[p[i].second], 1);         if (res >= q) {           return false;         }       }     } else {       for (int i = 0; i < n; i++) {         if (p[i].first == m) {           break;         }         for (; vol > 0 && rb[stc[vol]] <= p[i].first; vol--)           ;         stc[++vol] = p[i].second;         for (int i = vol - 1; i > 0; i--) {           if (rb[stc[i]] > rb[stc[i + 1]]) {             break;           }           double tmp = get(stc[i], stc[i + 1]);           ans += tmp;           res++;           std::swap(stc[i], stc[i + 1]);         }       }       ans += (q - res) * k;     }     return true;   }   int main() {     scanf( %d , &n);     ox = read();     oy = read();     scanf( %d , &q);     int pass = 0;     for (int i = 0; i < n; i++) {       a[i] = read();       b[i] = read();       if (std::abs(a[i]) < eps) {         cx[i] = ox;         cy[i] = b[i];       } else {         long double _a = -1 / a[i], _b = oy - _a * ox;         cx[i] = (_b - b[i]) / (a[i] - _a);         cy[i] = a[i] * cx[i] + b[i];       }       dis[i] = (ox - cx[i]) * (ox - cx[i]) + (oy - cy[i]) * (oy - cy[i]);       if (dis[i] < eps) {         pass++;       }     }     if (pass * (pass - 1ll) / 2 >= q) {       printf( 0.000000 n );       return 0;     }     for (long double l = Eps, r = 21e8, mid; l <= r;) {       mid = (l + r) / 2;       if (check(mid, false)) {         l = mid + Eps;         k = mid;       } else {         r = mid - Eps;       }     }     check(k, true);     printf( %.6f n , (double)ans);     return 0;   }