#include <bits/stdc++.h>
template <class T>
T Min(const T &a, const T &b) {
  return a < b ? a : b;
}
template <class T>
T Max(const T &a, const T &b) {
  return a > b ? a : b;
}
template <class T>
bool Chkmin(T &a, const T &b) {
  return a > b ? a = b, 1 : 0;
}
template <class T>
bool Chkmax(T &a, const T &b) {
  return a < b ? a = b, 1 : 0;
}
struct fast_input {
  static const int L = 1 << 15 | 1;
  char buf[L], *l, *r;
  fast_input() { l = r = buf; }
  void Next(char &c) {
    if (l == r) r = (l = buf) + fread(buf, 1, L, stdin);
    c = l == r ? (char)EOF : *l++;
  }
  template <class T>
  void operator()(T &x) {
    char c, f = 0;
    for (Next(c); !isdigit(c); Next(c))
      if (c == '-') f = 1;
    for (x = 0; isdigit(c); Next(c)) x = x * 10 + c - '0';
    if (f) x = -x;
  }
} input;
template <class T>
struct pair {
  T x, y;
  pair(T x = 0, T y = 0) : x(x), y(y) {}
  bool operator<(const pair<T> &o) const { return y < o.y; }
};
const int N = 200000 + 47;
const double PI = acos(-1.0);
const int L = 18;
const double EPS = 1E-10;
const int INF = 0x3f3f3f3f;
pair<int> point[N];
pair<double> range[N];
int nxt[N][L];
int n, m;
bool check(double r) {
  for (int i = (1), i_end = (n); i <= i_end; ++i) {
    double d =
        sqrt(1LL * point[i].x * point[i].x + 1LL * point[i].y * point[i].y);
    if (d < r) return false;
    double alpha = atan2(point[i].y, point[i].x);
    double beta = atan2(sqrt(d * d - r * r), r);
    if (alpha < 0) alpha += 2 * PI;
    double l = alpha - beta, r = alpha + beta;
    if (r > 2 * PI) {
      range[i] = pair<double>(0, r - 2 * PI);
      range[i + n] = pair<double>(l, r);
    } else if (l < 0) {
      range[i] = pair<double>(0, r);
      range[i + n] = pair<double>(l + 2 * PI, r + 2 * PI);
    } else {
      range[i] = pair<double>(l, r);
      range[i + n] = pair<double>(l + 2 * PI, r + 2 * PI);
    }
  }
  std::sort(range + 1, range + 2 * n + 1);
  int p = 1;
  for (int i = (1), i_end = (n * 2); i <= i_end; ++i) {
    while (p < 2 * n && range[p].x <= range[i].y) ++p;
    nxt[i][0] = p;
  }
  for (int i = (0), i_end = (L); i < i_end; ++i) nxt[p + 1][i] = p + 1;
  for (int i = (n * 2), i_end = (1); i >= i_end; --i)
    for (int j = (1), j_end = (L); j < j_end; ++j)
      nxt[i][j] = nxt[nxt[i][j - 1]][j - 1];
  int ret = INF, now;
  for (int i = (1), i_end = (n); i <= i_end; ++i) {
    p = i, now = 0;
    for (int j = (L - 1), j_end = (0); j >= j_end; --j)
      if (nxt[p][j] < i + n) p = nxt[p][j], now += 1 << j;
    Chkmin(ret, now + 1);
  }
  return ret <= m;
}
int main() {
  input(n), input(m);
  for (int i = (1), i_end = (n); i <= i_end; ++i)
    input(point[i].x), input(point[i].y);
  double l = 0, r = 150000, mid;
  while (r - l > EPS) {
    mid = (l + r) / 2;
    if (check(mid))
      l = mid;
    else
      r = mid;
  }
  printf("%.10lf\n", (l + r) / 2);
  return 0;
}
