#include <bits/stdc++.h>   using namespace std;   namespace io {   inline char nc() {     static char buf[100000], *p1 = buf, *p2 = buf;     return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2)                ? EOF                : *p1++;   }   template <class I>   inline void fr(I &num) {     num = 0;     register char c = nc();     register int p = 1;     while (c <  0  || c >  9 ) c ==  -  ? p = -1, c = nc() : c = nc();     while (c >=  0  && c <=  9 ) num = num * 10 + c -  0 , c = nc();     num *= p;   }   template <class I>   inline I Max(I p, I q) {     return p > q ? p : q;   }   template <class I>   inline I Min(I p, I q) {     return p < q ? p : q;   }   template <class I>   inline I A(I x) {     return x < 0 ? -x : x;   }   template <class I>   inline void sp(I &p, I &q) {     I x = p;     p = q, q = x;   }   template <class I>   inline void ckMax(I &p, I q) {     p = (p > q ? p : q);   }   template <class I>   inline void ckMin(I &p, I q) {     p = (p < q ? p : q);   }   };  // namespace io   using io ::A;   using io ::ckMax;   using io ::ckMin;   using io ::fr;   using io ::Max;   using io ::Min;   using io ::nc;   using io ::sp;   const int N = 1000005;   map<pair<int, int>, int> mp;   int n, k, cn, d;   inline void gcd(const int a, const int b) {     return !b ? d = a, void() : gcd(b, a % b);   }   inline double dis(const int x, const int y) {     return sqrt(1.0 * x * x + 1.0 * y * y);   }   struct ky {     int x, y;     double ds;     bool operator<(const ky &p) const { return ds < p.ds; }   };   vector<ky> vec[N];   vector<double> o;   int main() {     scanf( %d%d , &n, &k);     const int kk = k >> 1;     register double ans = 0;     for (register int i = 1, x, y; i <= n; ++i) {       scanf( %d%d , &x, &y);       if ((!x) && (!y)) {         vec[++cn].push_back((ky){x, y, 0});         continue;       }       gcd(A(x), A(y));       pair<int, int> p = make_pair(x / d, y / d);       if (!mp[p]) mp[p] = ++cn;       vec[mp[p]].push_back((ky){x, y, dis(x, y)});     }     for (register int j = 1, i; j <= cn; ++j) {       const int sz = vec[j].size();       register int mn = Min(kk, sz);       std::sort(vec[j].begin(), vec[j].end());       for (i = 1; i <= mn; ++i)         o.push_back(vec[j][sz - i].ds * ((k - i) - (i - 1)));       double s = 0;       mn = Min(k, sz);       for (i = kk + 1; i <= mn; ++i)         o.push_back(vec[j][i - kk - 1].ds * ((k - kk - 1) - kk) - 2.0 * s),             s += vec[j][i - kk - 1].ds;     }     std::sort(o.begin(), o.end());     for (register int i = o.size() - 1; (~i) && k; --i) ans += o[i], --k;     printf( %.9lf , ans);     return 0;   }   