#include <bits/stdc++.h>
const int maxn = 5e5 + 5;
const double eps = 1e-9;
using namespace std;
int rd() {
  int x = 0, f = 1;
  char c = getchar();
  while (!isdigit(c)) {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (isdigit(c)) x = (x << 3) + (x << 1) + c - '0', c = getchar();
  return x * f;
}
struct node {
  int x, y;
  double dis;
  node() {}
  node(int _x, int _y) {
    x = _x;
    y = _y;
    dis = sqrt(1.0 * x * x + 1.0 * y * y);
  }
} p[maxn];
bool tmp(const int &x, const int &y) { return p[x].dis > eps + p[y].dis; }
int n, k, tot, top;
double mx[maxn], ans;
int gcd(int x, int y) { return (y == 0) ? x : gcd(y, x % y); }
map<pair<int, int>, int> mp;
vector<int> vec[maxn];
void solve(vector<int> lst) {
  sort(lst.begin(), lst.end(), tmp);
  int len = ((int)lst.size());
  double sum = 0;
  for (int i = 0; i < min(len, k / 2); i++)
    mx[++top] = p[lst[i]].dis * (k - i - 1) - p[lst[i]].dis * i;
  for (int i = k / 2; i < len; i++) {
    int u = lst[len - i + k / 2 - 1];
    mx[++top] = p[u].dis * ((k & 1) - 1) - sum * 2;
    sum += p[u].dis;
  }
}
int main() {
  n = rd();
  k = rd();
  for (int i = 1, x, y; i <= n; i++) {
    x = rd();
    y = rd();
    p[i] = node(x, y);
    if (x == 0 && y == 0) {
      vec[++tot].push_back(i);
      continue;
    }
    int d = gcd(abs(x), abs(y));
    x /= d;
    y /= d;
    if (mp.count(make_pair(x, y)))
      vec[mp[make_pair(x, y)]].push_back(i);
    else
      vec[mp[make_pair(x, y)] = ++tot].push_back(i);
  }
  for (int i = 1; i <= tot; i++) solve(vec[i]);
  sort(mx + 1, mx + top + 1);
  for (int i = top; i >= top - k + 1; i--) ans += mx[i];
  printf("%.8lf\n", ans);
  return 0;
}
