#include <bits/stdc++.h>   using ul = std::uint32_t;   using li = std::int32_t;   using ll = std::int64_t;   using ull = std::uint64_t;   using vul = std::vector<ul>;   using vvul = std::vector<vul>;   using pulul = std::pair<ul, ul>;   using lf = long double;   ul n, m;   const lf pi = std::acos(lf(-1));   const lf eps = 1e-7;   class point {    public:     lf x = 0;     lf y = 0;     lf rho = 0;     lf theta = 0;   };   class segment {    public:     lf s = 0;     lf t = 0;     ul id = 0;   };   point data[100000];   segment segs[300000];   std::vector<segment> segv;   ul f[300000];   ul g[300000];   lf inner(const point& a, const point& b) { return a.x * b.x + a.y * b.y; }   lf norm2(const point& a) { return inner(a, a); }   lf mysqrt(lf x) { return std::sqrt(std::max(x, lf(0))); }   lf norm(const point& a) { return mysqrt(norm2(a)); }   lf myasin(lf x) { return std::asin(std::max(lf(-1), std::min(lf(1), x))); }   lf myacos(lf x) { return std::acos(std::max(lf(-1), std::min(lf(1), x))); }   lf theta(const point& a) {     lf rho = norm(a);     lf x = a.x;     lf y = a.y;     if (x < 0) {       if (y < 0) {         return pi + myacos(-x / rho);       } else {         return pi - myacos(-x / rho);       }     } else {       if (y < 0) {         return pi + pi - myacos(x / rho);       } else {         return myacos(x / rho);       }     }   }   int main() {     std::scanf( %u%u , &n, &m);     lf mx = 1.5e5;     for (ul i = 0; i != n; ++i) {       double tx, ty;       std::scanf( %lf%lf , &tx, &ty);       data[i].x = tx;       data[i].y = ty;       data[i].rho = norm(data[i]);       data[i].theta = theta(data[i]);       mx = std::min(mx, data[i].rho);       if (data[i].x == 0 && data[i].y == 0) {         std::printf( %.20lf n , lf(0));         return 0;       }     }     lf mn = 0;     while (mx - mn > eps) {       lf mid = (mx + mn) * lf(0.5);       for (ul i = 0; i != n; ++i) {         lf temp = myacos(mid / data[i].rho);         segs[i].s = data[i].theta - temp;         segs[i].t = data[i].theta + temp;         segs[i + n].s = segs[i].s + pi + pi;         segs[i + n].t = segs[i].t + pi + pi;         segs[i + n + n].s = segs[i + n].s + pi + pi;         segs[i + n + n].t = segs[i + n].t + pi + pi;       }       std::sort(segs, segs + n + n + n,                 [](const segment& a, const segment& b) { return a.t < b.t; });       segv.resize(0);       for (ul i = 0; i != n + n + n; ++i) {         segs[i].id = i;         segv.push_back(segs[i]);       }       ul key = 4e5;       ul keyid = 0;       for (ul i = 0, j = 0; i != segv.size(); ++i) {         for (; j != segv.size() && segv[j].s <= segv[i].t; ++j) {           g[j] = i - 1;           if (j >= n && j < n + n) {             if (key > j - i) {               key = j - i;               keyid = j;             }           }         }         f[i] = j;       }       if (ull(key) * ull(m) >= ull(n)) {         mn = mid;         continue;       }       bool flag = false;       for (ul i = keyid; i != g[keyid]; --i) {         ul j;         ul cnt;         for (j = i, cnt = 0;              cnt != m && j != segv.size() && segv[j].id < segv[i].id + n;              j = f[j], ++cnt)           ;         if (j == segv.size() || segv[j].id >= segv[i].id + n) {           flag = true;           break;         }       }       if (flag) {         mn = mid;       } else {         mx = mid;       }     }     std::printf( %.20lf n , double(mn));     return 0;   }