#include <iostream>
#include <complex>
#include <cstdio>

using namespace std;

typedef complex<double> Point;

const int N = 40;

int n, m;
double dp[N+1][N][N];
double triArea[N][N][N];
double point[N];

double getAreaTri(Point a, Point b, Point c){
  b -= a;
  c -= a;
  return abs(b.real()*c.imag() - b.imag()*c.real()) / 2.0;
}

void makeTable(){
  for(int i=0;i<n;++i){
    for(int j=i+1;j<n;++j){
      for(int k=j+1;k<n;++k){
	triArea[i][j][k] = getAreaTri(Point(cos(2.0*point[i]*M_PI), sin(2.0*point[i]*M_PI)),
				    Point(cos(2.0*point[j]*M_PI), sin(2.0*point[j]*M_PI)),
				    Point(cos(2.0*point[k]*M_PI), sin(2.0*point[k]*M_PI)));
      }
    }
  }
}

double solve(){
  double res = 0.0;
  makeTable();
  fill(dp[0][0], dp[N+1][0], 0.0);
  for(int k=2;k<m;++k){
    for(int i=0;i<n-2;++i){
      for(int j=i+1;j<n-1;++j){
	for(int t=j+1;t<n;++t){
	  dp[k+1][i][t] = max(dp[k+1][i][t], dp[k][i][j] + triArea[i][j][t]);
	}
      }
    }
  }
  for(int i=0;i<n;++i){
    for(int j=0;j<n;++j){
      res = max(res, dp[m][i][j]);
    }
  }
  return res;
}

int main(){
  while(cin >> n >> m && (n || m)){
    for(int i=0;i<n;++i){
      cin >> point[i];
    }
    printf("%6f\n", solve());
  }
  return 0;
}