#include <bits/stdc++.h>
#pragma GCC optimize("Ofast", "unroll-loops", "no-stack-protector")
using namespace std;
using ll = long long;
using ld = long double;
using pii = pair<int, int>;
using uint = unsigned int;
using ull = unsigned long long;
mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
default_random_engine generator;
void solve();
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cout << setprecision(16) << fixed;
  cerr << setprecision(16) << fixed;
  int tests = 1;
  for (int test = 1; test <= tests; ++test) {
    solve();
  }
}
struct Point {
  ll x, y;
};
bool operator<(const Point &a, const Point &b) {
  return tie(a.x, a.y) < tie(b.x, b.y);
}
bool operator==(const Point &a, const Point &b) {
  return tie(a.x, a.y) == tie(b.x, b.y);
}
ll dot(const Point &a, const Point &b) { return a.x * b.x + a.y * b.y; }
ll cross(const Point &a, const Point &b) { return a.x * b.y - a.y * b.x; }
ll dist2(const Point &a) { return dot(a, a); }
ld dist(const Point &a) { return hypotl(a.x, a.y); }
void solve() {
  int n, k;
  cin >> n >> k;
  vector<Point> p(n);
  for (int i = 0; i < n; ++i) {
    cin >> p[i].x >> p[i].y;
  }
  Point origin = {0, 0};
  for (int i = 0; i < n; ++i) {
    if (p[i] == origin) {
      swap(p[0], p[i]);
      break;
    }
  }
  sort(1 + (p).begin(), (p).end(), [&](const Point &a, const Point &b) {
    if (a < origin && origin < b) {
      return true;
    }
    if (b < origin && origin < a) {
      return false;
    }
    ll c = cross(a, b);
    if (c == 0) {
      return dist2(a) > dist2(b);
    }
    return c > 0;
  });
  vector<ld> val;
  val.push_back(0);
  vector<vector<ld>> arr;
  arr.push_back({});
  int cnt = 0;
  ld sum = 0;
  for (int i = 1; i < n; ++i) {
    if (cross(p[i], p[i - 1]) != 0 || dot(p[i], p[i - 1]) < 0) {
      cnt = 0;
      arr.push_back({});
    }
    arr.back().push_back(dist(p[i]));
    sum += (k - 1 - 2 * cnt) * dist(p[i]);
    if (k - 1 - 2 * cnt >= 0) {
      val.push_back((k - 1 - 2 * cnt) * dist(p[i]));
    }
    ++cnt;
  }
  sort((val).begin(), (val).end());
  reverse((val).begin(), (val).end());
  ld res = 0;
  if ((int)(val).size() >= k) {
    for (int i = 0; i < k; ++i) {
      res += val[i];
    }
  }
  for (int i = 0; i < (int)(arr).size(); ++i) {
    if (n - (int)(arr[i]).size() > (k + 1) / 2) {
      continue;
    }
    ld cur = sum;
    int cnt = 0;
    for (ld d : arr[i]) {
      cur -= (k - 1 - 2 * cnt) * d;
      ++cnt;
    }
    cnt = 0;
    for (int j = 0; j < k / 2; ++j) {
      cur += (k - 1 - 2 * cnt) * arr[i][j];
      ++cnt;
    }
    int rem = k - (k / 2 + (n - (int)(arr[i]).size()));
    for (int j = (int)(arr[i]).size() - rem; j < (int)(arr[i]).size(); ++j) {
      cur += (k - 1 - 2 * cnt) * arr[i][j];
      ++cnt;
    }
    res = max(res, cur);
  }
  cout << res << "\n";
}
