func_code_string: #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;   }   