#include <bits/stdc++.h>
using namespace std;
const int N = 205, M = 52;
int n, m, nn;
double f[N][N][M], ans, g[M];
vector<int> In[N], Out[N];
queue<int> D[N];
struct P {
  int x, y;
  P() {}
  P(int _x, int _y) {
    x = _x;
    y = _y;
  }
} A[N], B[N];
P operator-(P a, P b) { return P(a.x - b.x, a.y - b.y); }
bool operator<(P a, P b) { return atan2(a.y, a.x) < atan2(b.y, b.x); }
long long operator*(P a, P b) { return 1. * a.x * b.y - 1. * a.y * b.x; }
bool Left(P a, P b, P c) { return (b - a) * (c - a) < 0; }
void Add(int x, int y) {
  for (; D[x].size() && Left(B[D[x].front()], B[y], B[x]); D[x].pop())
    Add(D[x].front(), y);
  In[y].push_back(x);
  Out[x].push_back(y);
  D[y].push(x);
}
int main() {
  scanf("%d%d", &nn, &m);
  m--;
  for (int i = 1; i <= nn; i++) scanf("%d%d", &A[i].x, &A[i].y);
  for (int r = 1; r <= nn; r++) {
    n = 0;
    for (int i = 1; i <= nn; i++)
      if (A[i].y > A[r].y || A[i].y == A[r].y && A[i].x > A[r].x)
        B[++n] = A[i] - A[r];
    sort(B + 1, B + n + 1);
    for (int i = 1; i <= n; i++) {
      In[i].clear();
      Out[i].clear();
      for (; D[i].size(); D[i].pop())
        ;
    }
    for (int i = 1; i < n; i++) Add(i, i + 1);
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= n; j++)
        for (int k = 1; k < m; k++) f[i][j][k] = 0;
    for (int i = n; i; i--) {
      for (int j = 1; j < m; j++) g[j] = 0;
      int now = Out[i].size() - 1;
      for (int j = In[i].size() - 1; j >= 0; j--) {
        int x = In[i][j];
        long long area = B[x] * B[i];
        f[i][x][1] = area;
        for (int k = 2; k < m; k++)
          if (g[k - 1]) f[i][x][k] = area + g[k - 1];
        for (; now >= 0 && Left(B[x], B[Out[i][now]], B[i]); now--) {
          for (int k = 2; k < m; k++)
            if (g[k - 1] < f[Out[i][now]][i][k - 1]) {
              g[k - 1] = f[Out[i][now]][i][k - 1];
              f[i][x][k] = area + g[k - 1];
            }
        }
        ans = max(ans, f[i][x][m - 1]);
      }
    }
  }
  printf("%.2lf\n", .5 * ans);
  return 0;
}
