#include<cstdio>
#include<algorithm>
int N,C,L[6];
struct poly{
	int n;double a[7];
	double val(int x)const{
		double y=a[n];
		for(int i=n;i--;)y=y*x+a[i];
		return y;
	}
	poly operator+(const poly&p)const{
		poly q;q.n=n>p.n?n:p.n;
		for(int i=0;i<=q.n;i++)q.a[i]=(i<=n?a[i]:0)+(i<=p.n?p.a[i]:0);
		return q;
	}
	void integral(){
		for(int i=++n;i--;)a[i+1]=a[i]/(i+1);
	}
	poly move(int x)const{
		poly p=(poly){0,{a[n]}};
		for(int i=n;i--;){
			p.a[++p.n]=0;
			for(int j=p.n;j--;)p.a[j+1]+=p.a[j],p.a[j]*=-x; 
			p.a[0]+=a[i];
		}
		return p;
	}
};
struct func{
	int n,r[55];poly p[55];
	double val(int x)const{
		int i=0;while(r[i+1]<x)i++;
		return p[i].val(x);
	}
	func operator+(const func&f)const{
		func g;g.n=0;
		int i=0,j=0;
		while(i<n||j<f.n){
			if(j==f.n||i<n&&r[i+1]<=f.r[j+1]){
				g.p[g.n]=p[i++]+f.p[j];
				g.r[++g.n]=r[i];
				if(j<f.n&&r[i]==f.r[j+1])j++;
			}
			else{
				g.p[g.n]=p[i]+f.p[j++];
				g.r[++g.n]=f.r[j];
			}
		}
		//bool chk=1;
		//for(int i=0;i<g.n;i++)if(g.r[i+1]<=g.r[i])puts("WA");
		return g;
	}
	func operator*(double x)const{
		func f=*this;
		for(int i=0;i<n;i++)
			for(int j=0;j<=p[i].n;j++)f.p[i].a[j]*=x;
		return f;
	}
	func operator<<(int x)const{
		//for(int j=0;j<=n;j++)printf("(%d)",r[j]);puts("");
		//printf("<< %d\n",x);pr();
		func f;f.n=n;
		for(int i=0;i<=n;i++)f.r[i]=r[i];
		for(int i=0;i<n;i++){
			f.p[i].n=p[i].n+x;
			for(int j=0;j<=f.p[i].n;j++)f.p[i].a[j]=j<x?0:p[i].a[j-x];
		}
		//for(int j=0;j<=f.n;j++)printf("(%d)",f.r[j]);puts("");
		//f.pr();
		return f;
	}
	void integral(){
		//puts("before int");
		//pr();
		for(int i=0;i<n;i++){
			p[i].integral();
			if(i)p[i].a[0]+=p[i-1].val(r[i])-p[i].val(r[i]);
		}
		//puts("after int");
		//pr();
	}
	func move(int x)const{
		//printf("n=%d move=%d\n",n,x);pr();
		func f=*this;
		for(int i=0;i<n;i++){
			f.p[i]=f.p[i].move(x);
			f.r[i+1]+=x;
		}
		while(f.n&&f.r[f.n-1]>=C)f.n--;
		f.r[f.n]=C;
		//printf("fn=%d\n",f.n);f.pr();
		return f;
	}
	func set(int x,int k){
		func f;f.n=1;
		f.r[0]=0;f.r[1]=x;f.p[0].n=k;
		for(int i=0;i<=k;i++)f.p[0].a[i]=i==k;
		for(int i=0;i<k;i++)f.p[0].a[k]/=C;
		for(int i=0;i<n;i++)if(r[i+1]>x){
			f.p[f.n]=p[i];
			f.r[++f.n]=r[i+1];
		}
		return f;
	}
	void pr()const{
		for(int j=0;j<=n;j++)printf("(%d)",r[j]);puts("");
		for(int x=0;x<=C;x++)printf("(x=%d,y=%lf)\n",x,val(x));puts("");
	}
}f[32][6];
int main(){
	scanf("%d%d",&N,&C);
	for(int i=0;i<N;i++)scanf("%d",L+i);
	std::sort(L,L+N);
	for(int s=0;s<1<<N-1;s++){
		for(int i=0;i<N;i++)if(!(s>>i&1)){
			//printf("s=%d i=%d\n",s,i);
			f[s][i]=(func){1,{0,C},(poly){0,{0}}};
			if(s)for(int t=s;t;t=t-1&s){
				//printf("t=%d\n",t);
				int l[8],lc=*l=0;
				for(int j=0;j<N;j++)if((s>>j&1)&&!(t>>j&1))l[++lc]=L[j];
				std::sort(l,l+lc+1);
				if(l[lc]>=L[i])continue;
				l[++lc]=L[i];
				//printf("lc=%d\n",lc);
				for(int j=0;j<N;j++)if(t>>j&1){
					//printf("j=%d\n",j);
					double pro=1;
					for(int p=lc;p--;)pro/=C;
					for(int p=lc,r;p--;p?pro*=L[i]-l[p]:1)if(l[p]<(r=l[p+1]<L[j]?l[p+1]:L[j])){
						//printf("p=%d l=%d r=%d\n",p,l[p],r);
						double w=pro;
						for(int q=0;q<=p;q++){
							//printf("q=%d f[%d][%d]=\n",q,t^1<<j,j);f[t^1<<j][j].pr();
							func F=f[t^1<<j][j]<<q;
							//printf("*x^%d: ",q);F.pr();
							F.integral();
							//printf("int: ");F.pr();
							//printf("(%d) ",L[i]-r);F.move(L[i]-r).pr();
							//printf("(%d) ",L[i]-l[p]);F.move(L[i]-l[p]).pr();
							f[s][i]=f[s][i]+((F.move(L[i]-r)+F.move(L[i]-l[p])*(-1))*w<<p-q);
							w=-w*(p-q)/(q+1);
							//printf("q==%d\n",q);
						}
					}
					//printf("ok for j=%d\n",j);
				}
				//printf("ok t=%d\n",t);
			}
			f[s][i]=f[s][i].set(L[i],__builtin_popcount(s));
			//printf("f(%d,%d)=",s,i);f[s][i].pr();
		}
	}
	printf("%.12lf\n",f[(1<<N-1)-1][N-1].val(C));
}

Measured memory_bytes: 768