#include <bits/stdc++.h>
using namespace std;
const int N = 220, K = 55;
int n, m, cnt;
long long mx[K], f[N][N][K], ans;
vector<int> adj[N], rev[N];
queue<int> q[N];
struct P {
  int x, y;
  double ang;
  P(int x_ = 0, int y_ = 0) : x(x_), y(y_){};
  P operator+(const P &ky) const { return P(x + ky.x, y + ky.y); }
  P operator-(const P &ky) const { return P(x - ky.x, y - ky.y); }
  long long operator^(const P &ky) const {
    return 1ll * x * ky.y - 1ll * y * ky.x;
  }
  bool operator<(const P &ky) const { return ang < ky.ang; }
  inline void init() { ang = atan2(y, x); }
} a[N], p[N];
char ch;
inline void rd(int &x) {
  ch = getchar();
  x = 0;
  int f = 0;
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-') f = 1;
  for (; isdigit(ch); ch = getchar()) x = x * 10 + (ch ^ 48);
  if (f) x = -x;
}
inline bool onl(P a, P b, P c) { return ((b - a) ^ (c - b)) > 0; }
void add(int x, int y) {
  for (; !q[x].empty() && onl(p[q[x].front()], p[x], p[y]); q[x].pop())
    add(q[x].front(), y);
  (adj[y]).push_back(x);
  (rev[x]).push_back(y);
  q[y].push(x);
}
inline void pre(int id) {
  register int i;
  cnt = 0;
  for (i = 1; i <= n; ++i)
    if (i != id &&
        (a[i].x > a[id].x || (a[i].x == a[id].x && a[i].y > a[id].y))) {
      p[++cnt] = a[i] - a[id];
      p[cnt].init();
    }
  sort(p + 1, p + cnt + 1);
  for (i = 1; i <= cnt; ++i) {
    rev[i].clear();
    adj[i].clear();
    for (; !q[i].empty(); q[i].pop())
      ;
  }
  for (i = 1; i < cnt; ++i) add(i, i + 1);
}
inline void sol() {
  register int i, j, k, t, cur;
  long long res;
  memset((f), 0, sizeof((f)));
  for (i = cnt; i; --i) {
    memset((mx), 0, sizeof((mx)));
    cur = rev[i].size() - 1;
    for (j = adj[i].size() - 1; ~j; --j) {
      k = adj[i][j];
      res = p[k] ^ p[i];
      f[k][i][1] = res;
      for (t = 1; t < m; ++t)
        if (mx[t]) f[k][i][t + 1] = mx[t] + res;
      for (; ~cur && onl(p[k], p[i], p[rev[i][cur]]); --cur) {
        for (t = 1; t < m; ++t)
          if (mx[t] < f[i][rev[i][cur]][t]) {
            mx[t] = f[i][rev[i][cur]][t];
            f[k][i][t + 1] = mx[t] + res;
          }
      }
    }
  }
  for (i = n; i; --i)
    for (j = rev[i].size() - 1; ~j; --j) ans = max(ans, f[i][rev[i][j]][m - 2]);
}
int main() {
  register int i, j;
  rd(n);
  rd(m);
  for (i = 1; i <= n; ++i) rd(a[i].x), rd(a[i].y);
  for (i = 1; i <= n; ++i) {
    pre(i);
    sol();
  }
  printf("%.2f\n", (double)ans / 2.0);
  return 0;
}
