#include<bits/stdc++.h>
using namespace std;
#define int long long
struct Point{
  double x,y;
  Point(){}
  Point(double x,double y):x(x),y(y){}
  Point operator+(Point a){return Point(x+a.x,y+a.y);}
  Point operator-(Point a){return Point(x-a.x,y-a.y);}
  Point operator*(double k){return Point(x*k,y*k);}
  Point operator/(double k){return Point(x/k,y/k);}
};
typedef Point Vector;
typedef vector<Point> Polygon;
double norm(Point a){
  return a.x*a.x+a.y*a.y;
}
double abs(Point a){
  return sqrt(norm(a));
}
double dot(Point a,Point b){
  return a.x*b.x+a.y*b.y;
}
double cross(Point a,Point b){
  return a.x*b.y-a.y*b.x;
}
const double PI=3.141592653589793238;
Point trans(double k){
  return Point(cos(k*2*PI),sin(k*2*PI));
}
int n,m;
Polygon p;
double dp[50][50][50];
double dfs(int b,int c,int d){
  if(d==m) return 0;
  if(dp[b][c][d]>=0) return dp[b][c][d];
  double res=0;
  for(int a=c;a!=b;a=(a+1)%n){
    res=max(res,dfs(b,a,d+1)+abs(cross(p[a]-p[b],p[c]-p[b])));
  }
  return dp[b][c][d]=res;
}
signed main(){
  while(cin>>n>>m,n||m){
    p.clear();
    p.resize(n);
    for(int i=0;i<n;i++){
      double k;
      cin>>k;
      p[i]=trans(k);
      //cout<<p[i].x<<" "<<p[i].y<<endl;
    }
    for(int i=0;i<50;i++)
      for(int j=0;j<50;j++)
	for(int k=0;k<50;k++)
	  dp[i][j][k]=-1;
    double ans=0;
    for(int i=0;i<n;i++){
      for(int j=0;j<n;j++){
	if(i==j) continue;
	ans=max(ans,dfs(i,j,2));
      }
    }
    printf("%.6f\n",ans/2.0);
  }
  return 0;
}