#include <bits/stdc++.h>
const int maxn = 1e6 + 9, mod = 998244353, inf = 0x3f3f3f3f;
int Read() {
  int x(0), f(1);
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    x = (x << 3ll) + (x << 1ll) + c - '0';
    c = getchar();
  }
  return x * f;
}
void Chkmin(int &x, int y) {
  if (y < x) x = y;
}
void Chkmax(int &x, int y) {
  if (y > x) x = y;
}
int add(int x, int y) { return x += y, x >= mod ? x - mod : x; }
int dec(int x, int y) { return x -= y, x < 0 ? x + mod : x; }
int mul(int x, int y) { return 1ll * x * y % mod; }
int Pow(int base, int b) {
  int ret(1);
  while (b) {
    if (b & 1) ret = mul(ret, base);
    base = mul(base, base);
    b >>= 1;
  }
  return ret;
}
int Gcd(int a, int b) { return b ? Gcd(b, a % b) : a; }
struct point {
  int x, y;
} a[maxn];
int n, K;
double d[maxn];
std::multiset<double> Set;
std::map<std::pair<int, int>, std::vector<int> > mp;
std::map<std::pair<int, int>, std::vector<int> >::iterator it1;
double Dist(double x, double y) { return std::sqrt(x * x + y * y); }
bool cmp(int x, int y) { return d[x] > d[y]; }
int main() {
  n = Read();
  K = Read();
  for (int i = 1; i <= n; ++i) {
    int x(Read()), y(Read());
    if (!x && !y) continue;
    a[i] = (point){x, y};
    d[i] = Dist(x, y);
    int z(Gcd(std::abs(x), std::abs(y)));
    int xx(x / z), yy(y / z);
    mp[std::pair<int, int>(xx, yy)];
    it1 = mp.find(std::pair<int, int>(xx, yy));
    assert(it1 != mp.end());
    it1->second.push_back(i);
  }
  for (it1 = mp.begin(); it1 != mp.end(); ++it1) {
    std::vector<int> A(it1->second);
    std::sort(A.begin(), A.end(), cmp);
    int m(A.size());
    int ret(0);
    double pre(0);
    int j(1);
    for (int i = 1; i <= m; ++i)
      if (K - 2 * i + 1 >= 0) {
        int x(A[i - 1]);
        Set.insert(d[x] * (1.0 * (K - 2 * i + 1)));
        j = i + 1;
      } else {
        int x(A[m - 1 - (i - j)]);
        double tmp(-2.0 * pre);
        tmp += d[x] * (1.0 * (K - 2 * j + 1));
        Set.insert(tmp);
        pre += d[x];
      }
  }
  int flag(0);
  double ret(0);
  while (K--) {
    if (!Set.size()) {
      continue;
    }
    if (*Set.rbegin() <= 0 && !flag) {
      flag = 1;
      continue;
    }
    ret += *Set.rbegin();
    Set.erase(Set.find(*Set.rbegin()));
  }
  printf("%.10lf\n", ret);
  return 0;
}
