#include <bits/stdc++.h>

using namespace std;

int v[1000010];
int c[1000010];

#define MAX_N 1000010                           // adjust this value as needed
#define LOG_TWO_N 20                           // 2^10 > 1000, adjust this value as needed
#define EPS 1e-20
struct RMQ {                                          // Range Minimum Query
  int SpT[MAX_N][LOG_TWO_N];
  RMQ(){};
  void build(int n, int *A) {
    for (int i = 0; i < n; i++) SpT[i][0] = A[i]; // RMQ of sub array starting at index i + length 2^0=1
    for (int j = 1; (1<<j) <= n; j++)
      for (int i = 0; i + (1<<j) - 1 < n; i++)
        SpT[i][j] = min(SpT[i][j-1], SpT[i+(1<<(j-1))][j-1]);
  }
  int query(int i, int j) {
    int k = (int)floor(log((double)j-i+1) / log(2.0));    // 2^k <= (j-i+1)
    return min(SpT[i][k], SpT[j-(1<<k)+1][k]);
}
};
RMQ q1,q2;
double fat[1000010];

int main() {
	int n,k;
	//fat[0] =1.0;
	//for(int i = 1;i<=1000009;i++)
	//	fat[i] = fat[i-1] + (log2(i));

	scanf("%d %d",&n,&k);

	for(int i = 0;i<n;i++){
		scanf("%d",&v[i]);
		v[i]*=-100LL;
	}
	for(int j = 0;j<n;j++)
		scanf("%d",&c[j]);
	q1.build(n,v);
	q2.build(n,c);

	vector<int> show;
	for(int i = 0;i<n;i++){
		int lo = i,hi = n-1;
		while(lo<hi){
			int mid = (lo+hi+1)/2;
			pair<int,int> xd = make_pair(-q1.query(i,mid),q2.query(i,mid));//query(1,0,n-1,i,mid);
			if(xd.first<=xd.second)
				lo = mid;
			else
				hi = mid-1;
		}

		pair<int,int> ae =  make_pair(-q1.query(i,lo),q2.query(i,lo));//query(1,0,n-1,i,lo);
		pair<int,int> ae2;
		if(lo+1==n)ae2 = ae;
		else ae2 = make_pair(-q1.query(i,lo+1),q2.query(i,lo+1));

		if(min(ae.first,ae.second)>min(ae2.first,ae2.second))
			show.push_back(min(ae.first,ae.second));
		else
			show.push_back(min(ae2.first,ae2.second));
	}
	//double ans = 0.0;
	sort(show.begin(),show.end());
	 double ans = 0.0;
	  double prob = 1.0;
	  for (int i = 0; i <= n - k; i++) {
	    if (prob < 1e-100) {
	      break;
	    }
	    double q = k * 1.0 / (n - i);
	    ans += prob * q * show[i];
	    prob *= (1.0 - q);
	  }

	printf("%.10lf\n",((double) ans));
	return 0;
}


#include <bits/stdc++.h>

using namespace std;

int v[1000010];
int c[1000010];

#define MAX_N 1000010                           // adjust this value as needed
#define LOG_TWO_N 20                           // 2^10 > 1000, adjust this value as needed

struct RMQ {                                          // Range Minimum Query
  int SpT[MAX_N][LOG_TWO_N];
  RMQ(){};
  void build(int n, int *A) {
    for (int i = 0; i < n; i++) SpT[i][0] = A[i]; // RMQ of sub array starting at index i + length 2^0=1
    for (int j = 1; (1<<j) <= n; j++)
      for (int i = 0; i + (1<<j) - 1 < n; i++)
        SpT[i][j] = min(SpT[i][j-1], SpT[i+(1<<(j-1))][j-1]);
  }
  int query(int i, int j) {
    int k = (int)floor(log((double)j-i+1) / log(2.0));    // 2^k <= (j-i+1)
    return min(SpT[i][k], SpT[j-(1<<k)+1][k]);
}
};
RMQ q1,q2;
double fat[1000010];

int main() {
	int n,k;
	fat[0] =1.0;
	for(int i = 1;i<=1000009;i++)
		fat[i] = fat[i-1] + (log2(i));

	scanf("%d %d",&n,&k);

	for(int i = 0;i<n;i++){
		scanf("%d",&v[i]);
		v[i]*=-100LL;
	}
	for(int j = 0;j<n;j++)
		scanf("%d",&c[j]);
	q1.build(n,v);
	q2.build(n,c);

	vector<int> show;
	for(int i = 0;i<n;i++){
		int lo = i,hi = n-1;
		while(lo<hi){
			int mid = (lo+hi+1)/2;
			pair<int,int> xd = make_pair(-q1.query(i,mid),q2.query(i,mid));//query(1,0,n-1,i,mid);
			if(xd.first<=xd.second)
				lo = mid;
			else
				hi = mid-1;
		}

		pair<int,int> ae =  make_pair(-q1.query(i,lo),q2.query(i,lo));//query(1,0,n-1,i,lo);
		pair<int,int> ae2;
		if(lo+1==n)ae2 = ae;
		else ae2 = make_pair(-q1.query(i,lo+1),q2.query(i,lo+1));

		if(min(ae.first,ae.second)>min(ae2.first,ae2.second))
			show.push_back(min(ae.first,ae.second));
		else
			show.push_back(min(ae2.first,ae2.second));
	}
	double ans = 0.0;
	sort(show.begin(),show.end());
	double aux = log2(k);
	for(int i = 0;i<=n-k;i++)
		ans+=show[i]*pow(2,fat[n-i-1]+fat[n-k]+aux-fat[n-i-k]-fat[n]);

	printf("%.10lf\n",((double) ans));
	return 0;
}


#include <bits/stdc++.h>

using namespace std;

int v[1000010];
int c[1000010];

#define MAX_N 1000010                           // adjust this value as needed
#define LOG_TWO_N 20                           // 2^10 > 1000, adjust this value as needed

struct RMQ {                                          // Range Minimum Query
  int SpT[MAX_N][LOG_TWO_N];
  RMQ(){};
  void build(int n, int *A) {
    for (int i = 0; i < n; i++) SpT[i][0] = A[i]; // RMQ of sub array starting at index i + length 2^0=1
    for (int j = 1; (1<<j) <= n; j++)
      for (int i = 0; i + (1<<j) - 1 < n; i++)
        SpT[i][j] = min(SpT[i][j-1], SpT[i+(1<<(j-1))][j-1]);
  }
  int query(int i, int j) {
    int k = (int)floor(log((double)j-i+1) / log(2.0));    // 2^k <= (j-i+1)
    return min(SpT[i][k], SpT[j-(1<<k)+1][k]);
}
};
RMQ q1,q2;
long double fat[1000010];

int main() {
	int n,k;
	fat[0] =1.0;
	for(int i = 1;i<=1000009;i++)
		fat[i] = fat[i-1] + (logl(i));

	scanf("%d %d",&n,&k);

	for(int i = 0;i<n;i++){
		scanf("%d",&v[i]);
		v[i]*=-100LL;
	}
	for(int j = 0;j<n;j++)
		scanf("%d",&c[j]);
	q1.build(n,v);
	q2.build(n,c);

	vector<pair<int,int> > show;
	for(int i = 0;i<n;i++){
		int lo = i,hi = n-1;
		while(lo<hi){
			int mid = (lo+hi+1)/2;
			pair<int,int> xd = make_pair(-q1.query(i,mid),q2.query(i,mid));//query(1,0,n-1,i,mid);
			if(xd.first<=xd.second)
				lo = mid;
			else
				hi = mid-1;
		}

		pair<int,int> ae =  make_pair(-q1.query(i,lo),q2.query(i,lo));//query(1,0,n-1,i,lo);
		pair<int,int> ae2;
		if(lo+1==n)ae2 = ae;
		else ae2 = make_pair(-q1.query(i,lo+1),q2.query(i,lo+1));

		if(min(ae.first,ae.second)>min(ae2.first,ae2.second))
			show.push_back(make_pair(min(ae.first,ae.second),i));
		else
			show.push_back(make_pair(min(ae2.first,ae2.second),i));
	}
	long double ans = 0.0;
	sort(show.begin(),show.end());
	long double aux = logl(k);
	for(int i = 0;i<=n-k;i++)
		ans+=show[i].first*expl(fat[n-i-1]+fat[n-k]+aux - fat[n-i-k]-fat[n]);

	printf("%.10lf\n",((double) ans));
	return 0;
}


#include <bits/stdc++.h>

using namespace std;

long long v[1000010];
long long c[1000010];
long long st1[1000010],st2[1000010];
int n,k;
void build(int at,int l, int r){
	if(l == r){
		st1[at] = v[l];
		st2[at] = c[l];
		return ;
	}
	int mid = (l+r)/2;
	int nxt = at*2;
	build(nxt,l,mid);
	build(nxt+1,mid+1,r);
	st1[at] = max(st1[nxt],st1[nxt+1]);
	st2[at] = min(st2[nxt],st2[nxt+1]);
}

pair<long long,long long> query(int at, int l, int r, int i, int j){
	if(j<l || i>r)
		return make_pair(-100000000000000000ll,100000000000000000ll);
	if(l>=i && r<=j)
		return make_pair(st1[at],st2[at]);
	pair<long long,long long> a, b;
	int mid = (l+r)/2;
	int nxt = at*2;
	a = query(nxt,l,mid,i,j);
	b = query(nxt+1,mid+1,r,i,j);
	return make_pair(max(a.first,b.first),min(a.second,b.second));
}

long double fat[1000010];

int main() {

	fat[0] =1.0;
	for(int i = 1;i<=1000009;i++)
		fat[i] = fat[i-1] * ((long double)i);

	scanf("%d %d",&n,&k);

	for(int i = 0;i<n;i++){
		scanf("%lld",&v[i]);
		v[i]*=100LL;
	}
	for(int j = 0;j<n;j++)
		scanf("%lld",&c[j]);
	build(1,0,n-1);
	vector<pair<long long,int> > show;
	for(int i = 0;i<n;i++){
		int lo = i,hi = n-1;
		while(lo<hi){
			int mid = (lo+hi+1)/2;
			pair<long long,long long> xd = query(1,0,n-1,i,mid);
			if(xd.first<=xd.second)
				lo = mid;
			else
				hi = mid-1;
		}

		pair<long long,long long> ae =  query(1,0,n-1,i,lo);

		show.push_back(make_pair(min(ae.first,ae.second),i));
	}
	long double ans = 0.0;
	//(n-i-1)! * k * (n-k)!)/((n-i-k)! * n!)
	sort(show.begin(),show.end());
	for(int i = 0;i<=n-k;i++){
		ans+=(show[i].first*fat[n-i-1]/fat[n-i-k])*k * fat[n-k]/fat[n];

	}
	printf("%.10lf\n",((double) ans));
	return 0;
}


#include <bits/stdc++.h>

using namespace std;
int v[1000010];
int c[1000010];
float fat[1000010];
int show[1000010];
int main() {
	int n,k;
	fat[0] =1.0;
	for(int i = 1;i<=1000009;i++)
		fat[i] = fat[i-1] + (logf(i));
	scanf("%d %d",&n,&k);
	for(int i = 0;i<n;i++){
		scanf("%d",&v[i]);
		v[i]*=100LL;
	}
	for(int j = 0;j<n;j++)
		scanf("%d",&c[j]);

	show[n-1] = min(v[n-1],c[n-1]);
	for(int i = n-2;i>=0;i--)
		show[i] = min(max(show[i+1],v[i]),c[i]);
	double ans = 0.0;
	sort(show,show+n);
	double aux = log(k);
	for(int i = 0;i<=n-k;i++)
		ans+=show[i]*expf(fat[n-i-1]+fat[n-k]+aux-fat[n-i-k]-fat[n]);
	printf("%.10f\n",ans);
	return 0;
}


#include <bits/stdc++.h>

using namespace std;

int v[1000010];
int c[1000010];

#define MAX_N 1000010                           // adjust this value as needed
#define LOG_TWO_N 20                           // 2^10 > 1000, adjust this value as needed
#define EPS 1e-20
struct RMQ {                                          // Range Minimum Query
  int SpT[MAX_N][LOG_TWO_N];
  RMQ(){};
  void build(int n, int *A) {
    for (int i = 0; i < n; i++) SpT[i][0] = A[i]; // RMQ of sub array starting at index i + length 2^0=1
    for (int j = 1; (1<<j) <= n; j++)
      for (int i = 0; i + (1<<j) - 1 < n; i++)
        SpT[i][j] = min(SpT[i][j-1], SpT[i+(1<<(j-1))][j-1]);
  }
  int query(int i, int j) {
    int k = (int)floor(log((double)j-i+1) / log(2.0));    // 2^k <= (j-i+1)
    return min(SpT[i][k], SpT[j-(1<<k)+1][k]);
}
};
RMQ q1,q2;
double fat[1000010];
int show[1000010];
int main() {
	int n,k;
	fat[0] =1.0;
	for(int i = 1;i<=1000009;i++)
		fat[i] = fat[i-1] + (log2(i));

	scanf("%d %d",&n,&k);

	for(int i = 0;i<n;i++){
		scanf("%d",&v[i]);
		v[i]*=-100LL;
	}
	for(int j = 0;j<n;j++)
		scanf("%d",&c[j]);
	q1.build(n,v);
	q2.build(n,c);

	for(int i = 0;i<n;i++){
		long long lo = i,hi = n-1;
		while(lo<hi){
			long long mid = (lo+hi+1)/2;
			pair<int,int> xd = make_pair(-q1.query(i,mid),q2.query(i,mid));//query(1,0,n-1,i,mid);
			if(xd.first<=xd.second)
				lo = mid;
			else
				hi = mid-1;
		}

		pair<int,int> ae =  make_pair(-q1.query(i,lo),q2.query(i,lo));//query(1,0,n-1,i,lo);
		pair<int,int> ae2;
		if(lo+1==n)ae2 = ae;
		else ae2 = make_pair(-q1.query(i,lo+1),q2.query(i,lo+1));
		int x1 = min(ae.first,ae.second),x2 = min(ae2.first,ae2.second);
		if(x1>x2)
			show[i] = (x1);
		else
			show[i] = (x2);
	}
	double ans = 0.0;
	sort(show,show+n);
	double aux = log2(k);
	for(int i = 0;i<=n-k;i++){
		double xd = pow(2,fat[n-i-1]+fat[n-k]+aux-fat[n-i-k]-fat[n]);
		ans+=show[i]*xd;
	}

	printf("%.10lf\n",((double) ans));
	return 0;
}


#include <bits/stdc++.h>

using namespace std;

long long v[1000010];
long long c[1000010];
long long st1[1000010],st2[1000010];
int n,k;
void build(int at,int l, int r){
	if(l == r){
		st1[at] = v[l];
		st2[at] = c[l];
		return ;
	}
	int mid = (l+r)/2;
	int nxt = at*2;
	build(nxt,l,mid);
	build(nxt+1,mid+1,r);
	st1[at] = max(st1[nxt],st1[nxt+1]);
	st2[at] = min(st2[nxt],st2[nxt+1]);
}

pair<long long,long long> query(int at, int l, int r, int i, int j){
	if(j<l || i>r)
		return make_pair(-100000000000000000ll,100000000000000000ll);
	if(l>=i && r<=j)
		return make_pair(st1[at],st2[at]);
	pair<long long,long long> a, b;
	int mid = (l+r)/2;
	int nxt = at*2;
	a = query(nxt,l,mid,i,j);
	b = query(nxt+1,mid+1,r,i,j);
	return make_pair(max(a.first,b.first),min(a.second,b.second));
}

long double fat[1000010];

int main() {

	fat[0] =1.0;
	for(int i = 1;i<=1000009;i++)
		fat[i] = fat[i-1] + (logl(i));

	scanf("%d %d",&n,&k);

	for(int i = 0;i<n;i++){
		scanf("%lld",&v[i]);
		v[i]*=100LL;
	}
	for(int j = 0;j<n;j++)
		scanf("%lld",&c[j]);
	build(1,0,n-1);
	vector<pair<long long,int> > show;
	for(int i = 0;i<n;i++){
		int lo = i,hi = n-1;
		while(lo<hi){
			int mid = (lo+hi+1)/2;
			pair<long long,long long> xd = query(1,0,n-1,i,mid);
			if(xd.first<=xd.second)
				lo = mid;
			else
				hi = mid-1;
		}

		pair<long long,long long> ae =  query(1,0,n-1,i,lo);
		pair<long long,long long> ae2;
		if(lo+1==n)ae2 = ae;
		else ae2 = query(1,0,n-1,i,lo+1);

		if(min(ae.first,ae.second)>min(ae2.first,ae2.second))
			show.push_back(make_pair(min(ae.first,ae.second),i));
		else
			show.push_back(make_pair(min(ae2.first,ae2.second),i));
	}
	long double ans = 0.0;
	sort(show.begin(),show.end());
	long double aux = logl(k);
	for(int i = 0;i<=n-k;i++)
		ans+=show[i].first*expl(fat[n-i-1]+fat[n-k]+aux - fat[n-i-k]-fat[n]);

	printf("%.10lf\n",((double) ans));
	return 0;
}


#include <bits/stdc++.h>

using namespace std;

int v[1000010];
int c[1000010];

#define MAX_N 1000010                           // adjust this value as needed
#define LOG_TWO_N 20                           // 2^10 > 1000, adjust this value as needed

struct RMQ {                                          // Range Minimum Query
  int SpT[MAX_N][LOG_TWO_N];
  RMQ(){};
  void build(int n, int *A) {
    for (int i = 0; i < n; i++) SpT[i][0] = A[i]; // RMQ of sub array starting at index i + length 2^0=1
    for (int j = 1; (1<<j) <= n; j++)
      for (int i = 0; i + (1<<j) - 1 < n; i++)
        SpT[i][j] = min(SpT[i][j-1], SpT[i+(1<<(j-1))][j-1]);
  }
  int query(int i, int j) {
    int k = (int)floor(log((double)j-i+1) / log(2.0));    // 2^k <= (j-i+1)
    return min(SpT[i][k], SpT[j-(1<<k)+1][k]);
}
};
RMQ q1,q2;
double fat[1000010];

int main() {
	int n,k;
	fat[0] =1.0;
	for(int i = 1;i<=1000009;i++)
		fat[i] = fat[i-1] + (log2(i));

	scanf("%d %d",&n,&k);

	for(int i = 0;i<n;i++){
		scanf("%d",&v[i]);
		v[i]*=-100LL;
	}
	for(int j = 0;j<n;j++)
		scanf("%d",&c[j]);
	q1.build(n,v);
	q2.build(n,c);

	vector<pair<int,int> > show;
	for(int i = 0;i<n;i++){
		int lo = i,hi = n-1;
		while(lo<hi){
			int mid = (lo+hi+1)/2;
			pair<int,int> xd = make_pair(-q1.query(i,mid),q2.query(i,mid));//query(1,0,n-1,i,mid);
			if(xd.first<=xd.second)
				lo = mid;
			else
				hi = mid-1;
		}

		pair<int,int> ae =  make_pair(-q1.query(i,lo),q2.query(i,lo));//query(1,0,n-1,i,lo);
		pair<int,int> ae2;
		if(lo+1==n)ae2 = ae;
		else ae2 = make_pair(-q1.query(i,lo+1),q2.query(i,lo+1));

		if(min(ae.first,ae.second)>min(ae2.first,ae2.second))
			show.push_back(make_pair(min(ae.first,ae.second),i));
		else
			show.push_back(make_pair(min(ae2.first,ae2.second),i));
	}
	double ans = 0.0;
	sort(show.begin(),show.end());
	double aux = log(k);
	for(int i = 0;i<=n-k;i++)
		ans+=show[i].first*pow(2,fat[n-i-1]+fat[n-k]+aux-fat[n-i-k]-fat[n]);

	printf("%.10lf\n",((double) ans));
	return 0;
}


#include <bits/stdc++.h>

using namespace std;

long long v[1000010];
long long c[1000010];
long long st1[1000010],st2[1000010];
int n,k;
void build(int at,int l, int r){
	if(l == r){
		st1[at] = v[l];
		st2[at] = c[l];
		return ;
	}
	int mid = (l+r)/2;
	int nxt = at*2;
	build(nxt,l,mid);
	build(nxt+1,mid+1,r);
	st1[at] = max(st1[nxt],st1[nxt+1]);
	st2[at] = min(st2[nxt],st2[nxt+1]);
}

pair<long long,long long> query(int at, int l, int r, int i, int j){
	if(j<l || i>r)
		return make_pair(-100000000000000000ll,100000000000000000ll);
	if(l>=i && r<=j)
		return make_pair(st1[at],st2[at]);
	pair<long long,long long> a, b;
	int mid = (l+r)/2;
	int nxt = at*2;
	a = query(nxt,l,mid,i,j);
	b = query(nxt+1,mid+1,r,i,j);
	return make_pair(max(a.first,b.first),min(a.second,b.second));
}

long double fat[1000010];

int main() {

	fat[0] =1.0;
	for(int i = 1;i<=1000009;i++)
		fat[i] = fat[i-1] * ((long double)i);

	scanf("%d %d",&n,&k);

	for(int i = 0;i<n;i++){
		scanf("%lld",&v[i]);
		v[i]*=100LL;
	}
	for(int j = 0;j<n;j++)
		scanf("%lld",&c[j]);
	build(1,0,n-1);
	vector<pair<long long,int> > show;
	for(int i = 0;i<n;i++){
		int lo = i,hi = n-1;
		while(lo<hi){
			int mid = (lo+hi+1)/2;
			pair<long long,long long> xd = query(1,0,n-1,i,mid);
			if(xd.first<=xd.second)
				lo = mid;
			else
				hi = mid-1;
		}

		pair<long long,long long> ae =  query(1,0,n-1,i,lo);

		show.push_back(make_pair(min(ae.first,ae.second),i));
	}
	long double ans = 0.0;
	//(n-i-1)! * k * (n-k)!)/((n-i-k)! * n!)
	sort(show.begin(),show.end());
	for(int i = 0;i<=n-k;i++){
		ans+=(show[i].first*fat[n-i-1]/fat[n-i-k]);

	}
	printf("%.10lf\n",((double) (ans*(k*fat[n-k]/fat[n]))));
	return 0;
}


#include <bits/stdc++.h>

using namespace std;
int v[1000010];
int c[1000010];
float fat[1000010];
int show[1000010];
int main() {
	int n,k;
	fat[0] =1.0;
	for(int i = 1;i<=1000009;i++)
		fat[i] = fat[i-1] + (logf(i));
	scanf("%d %d",&n,&k);
	for(int i = 0;i<n;i++){
		scanf("%d",&v[i]);
		v[i]*=100LL;
	}
	for(int j = 0;j<n;j++)
		scanf("%d",&c[j]);

	show[n-1] = min(v[n-1],c[n-1]);
	for(int i = n-2;i>=0;i--)
		show[i] = min(max(show[i+1],v[i]),c[i]);
	float ans = 0.0;
	sort(show,show+n);
	float aux = logf(k);
	for(int i = 0;i<=n-k;i++)
		ans+=show[i]*expf(fat[n-i-1]+fat[n-k]+aux-fat[n-i-k]-fat[n]);
	printf("%.10f\n",ans);
	return 0;
}


#include <bits/stdc++.h>

using namespace std;

int v[1000010];
int c[1000010];

#define MAX_N 1000010                           // adjust this value as needed
#define LOG_TWO_N 20                           // 2^10 > 1000, adjust this value as needed
#define EPS 1e-20
struct RMQ {                                          // Range Minimum Query
  int SpT[MAX_N][LOG_TWO_N];
  RMQ(){};
  void build(int n, int *A) {
    for (int i = 0; i < n; i++) SpT[i][0] = A[i]; // RMQ of sub array starting at index i + length 2^0=1
    for (int j = 1; (1<<j) <= n; j++)
      for (int i = 0; i + (1<<j) - 1 < n; i++)
        SpT[i][j] = min(SpT[i][j-1], SpT[i+(1<<(j-1))][j-1]);
  }
  int query(int i, int j) {
    int k = (int)floor(log2((double)j-i+1));    // 2^k <= (j-i+1)
    return min(SpT[i][k], SpT[j-(1<<k)+1][k]);
}
};
RMQ q1,q2;
double fat[1000010];
int show[1000010];
int main() {
	int n,k;
	fat[0] =1.0;
	for(int i = 1;i<=1000009;i++)
		fat[i] = fat[i-1] + (log2(i));

	scanf("%d %d",&n,&k);

	for(int i = 0;i<n;i++){
		scanf("%d",&v[i]);
		v[i]*=-100LL;
	}
	for(int j = 0;j<n;j++)
		scanf("%d",&c[j]);
	q1.build(n,v);
	q2.build(n,c);

	for(int i = 0;i<n;i++){
		long long lo = i,hi = n-1;
		while(lo<hi){
			long long mid = (lo+hi+1)/2;
			int ma = -q1.query(i,mid);
			int me = q2.query(i,mid);//query(1,0,n-1,i,mid);
			if(ma<=me)
				lo = mid;
			else
				hi = mid-1;
		}

		int x1 =  min(-q1.query(i,lo),q2.query(i,lo));//query(1,0,n-1,i,lo);
		int x2;
		if(lo+1==n)x2 = x1;
		else x2 = min(-q1.query(i,lo+1),q2.query(i,lo+1));
		if(x1>x2)
			show[i] = (x1);
		else
			show[i] = (x2);
	}
	double ans = 0.0;
	sort(show,show+n);
	double aux = log2(k);
	for(int i = 0;i<=min(100,n-k);i++){
		double xd = pow(2,fat[n-i-1]+fat[n-k]+aux-fat[n-i-k]-fat[n]);
		ans+=show[i]*xd;
	}

	printf("%.10lf\n",((double) ans));
	return 0;
}


#include <bits/stdc++.h>

using namespace std;
int v[1000010];
int c[1000010];
double fat[1000010];
int show[1000010];
int main() {
	int n,k;
	fat[0] =1.0;
	for(int i = 1;i<=1000009;i++)
		fat[i] = fat[i-1] + (log(i));
	scanf("%d %d",&n,&k);
	for(int i = 0;i<n;i++){
		scanf("%d",&v[i]);
		v[i]*=100LL;
	}
	for(int j = 0;j<n;j++)
		scanf("%d",&c[j]);

	show[n-1] = min(v[n-1],c[n-1]);
	for(int i = n-2;i>=0;i--)
		show[i] = min(max(show[i+1],v[i]),c[i]);
	double ans = 0.0;
	sort(show,show+n);
	double aux = log(k);
	for(int i = 0;i<=n-k;i++)
		ans+=show[i]*exp(fat[n-i-1]+fat[n-k]+aux-fat[n-i-k]-fat[n]);
	printf("%.10lf\n",ans);
	return 0;
}


#include <bits/stdc++.h>

using namespace std;

int v[1000010];
int c[1000010];

#define MAX_N 1000010                           // adjust this value as needed
#define LOG_TWO_N 20                           // 2^10 > 1000, adjust this value as needed
#define EPS 1e-20
struct RMQ {                                          // Range Minimum Query
  int SpT[MAX_N][LOG_TWO_N];
  RMQ(){};
  void build(int n, int *A) {
    for (int i = 0; i < n; i++) SpT[i][0] = A[i]; // RMQ of sub array starting at index i + length 2^0=1
    for (int j = 1; (1<<j) <= n; j++)
      for (int i = 0; i + (1<<j) - 1 < n; i++)
        SpT[i][j] = min(SpT[i][j-1], SpT[i+(1<<(j-1))][j-1]);
  }
  int query(int i, int j) {
    int k = (int)floor(log2f((double)j-i+1));    // 2^k <= (j-i+1)
    return min(SpT[i][k], SpT[j-(1<<k)+1][k]);
}
};
//RMQ q1,q2;
double fat[1000010];
int show[1000010];
int main() {
	int n,k;
	fat[0] =1.0;
	for(int i = 1;i<=1000009;i++)
		fat[i] = fat[i-1] + (logf(i));

	scanf("%d %d",&n,&k);

	for(int i = 0;i<n;i++){
		scanf("%d",&v[i]);
		v[i]*=100LL;
	}
	for(int j = 0;j<n;j++)
		scanf("%d",&c[j]);
	//q1.build(n,v);
//	q2.build(n,c);

	show[n-1] = min(v[n-1],c[n-1]);
	for(int i = n-2;i>=0;i--)
		show[i] = min(max(show[i+1],v[i]),c[i]);

	double ans = 0.0;
	sort(show,show+n);
	double aux = logf(k);
	for(int i = 0;i<=n-k;i++){
		double xd = expf(fat[n-i-1]+fat[n-k]+aux-fat[n-i-k]-fat[n]);
		ans+=show[i]*xd;
	}

	printf("%.10lf\n",((double) ans));
	return 0;
}


#include <bits/stdc++.h>

using namespace std;

int v[1000010];
int c[1000010];

#define MAX_N 1000010                           // adjust this value as needed
#define LOG_TWO_N 20                           // 2^10 > 1000, adjust this value as needed

struct RMQ {                                          // Range Minimum Query
  int SpT[MAX_N][LOG_TWO_N];
  RMQ(){};
  void build(int n, int *A) {
    for (int i = 0; i < n; i++) SpT[i][0] = A[i]; // RMQ of sub array starting at index i + length 2^0=1
    for (int j = 1; (1<<j) <= n; j++)
      for (int i = 0; i + (1<<j) - 1 < n; i++)
        SpT[i][j] = min(SpT[i][j-1], SpT[i+(1<<(j-1))][j-1]);
  }
  int query(int i, int j) {
    int k = (int)floor(log((double)j-i+1) / log(2.0));    // 2^k <= (j-i+1)
    return min(SpT[i][k], SpT[j-(1<<k)+1][k]);
}
};
RMQ q1,q2;
double fat[1000010];

int main() {
	int n,k;
	fat[0] =1.0;
	for(int i = 1;i<=1000009;i++)
		fat[i] = fat[i-1] + (log(i));

	scanf("%d %d",&n,&k);

	for(int i = 0;i<n;i++){
		scanf("%d",&v[i]);
		v[i]*=-100LL;
	}
	for(int j = 0;j<n;j++)
		scanf("%d",&c[j]);
	q1.build(n,v);
	q2.build(n,c);

	vector<pair<int,int> > show;
	for(int i = 0;i<n;i++){
		int lo = i,hi = n-1;
		while(lo<hi){
			int mid = (lo+hi+1)/2;
			pair<int,int> xd = make_pair(-q1.query(i,mid),q2.query(i,mid));//query(1,0,n-1,i,mid);
			if(xd.first<=xd.second)
				lo = mid;
			else
				hi = mid-1;
		}

		pair<int,int> ae =  make_pair(-q1.query(i,lo),q2.query(i,lo));//query(1,0,n-1,i,lo);
		pair<int,int> ae2;
		if(lo+1==n)ae2 = ae;
		else ae2 = make_pair(-q1.query(i,lo+1),q2.query(i,lo+1));

		if(min(ae.first,ae.second)>min(ae2.first,ae2.second))
			show.push_back(make_pair(min(ae.first,ae.second),i));
		else
			show.push_back(make_pair(min(ae2.first,ae2.second),i));
	}
	double ans = 0.0;
	sort(show.begin(),show.end());
	double aux = log(k);
	for(int i = 0;i<=n-k;i++)
		ans+=show[i].first*exp(fat[n-i-1]+fat[n-k]+aux-fat[n-i-k]-fat[n]);

	printf("%.10lf\n",((double) ans));
	return 0;
}


#include <bits/stdc++.h>

using namespace std;
int v[1000010];
int c[1000010];
double fat[1000010];
int show[1000010];
int main() {
	int n,k;
	fat[0] =1.0;
	for(int i = 1;i<=1000009;i++)
		fat[i] = fat[i-1] + (logf(i));
	scanf("%d %d",&n,&k);
	for(int i = 0;i<n;i++){
		scanf("%d",&v[i]);
		v[i]*=100LL;
	}
	for(int j = 0;j<n;j++)
		scanf("%d",&c[j]);

	show[n-1] = min(v[n-1],c[n-1]);
	for(int i = n-2;i>=0;i--)
		show[i] = min(max(show[i+1],v[i]),c[i]);
	double ans = 0.0;
	sort(show,show+n);
	double aux = log(k);
	for(int i = 0;i<=n-k;i++)
		ans+=show[i]*expf(fat[n-i-1]+fat[n-k]+aux-fat[n-i-k]-fat[n]);
	printf("%.10lf\n",ans);
	return 0;
}


#include <bits/stdc++.h>

using namespace std;

int v[1000010];
int c[1000010];

#define MAX_N 1000010                           // adjust this value as needed
#define LOG_TWO_N 20                           // 2^10 > 1000, adjust this value as needed
#define EPS 1e-20
struct RMQ {                                          // Range Minimum Query
  int SpT[MAX_N][LOG_TWO_N];
  RMQ(){};
  void build(int n, int *A) {
    for (int i = 0; i < n; i++) SpT[i][0] = A[i]; // RMQ of sub array starting at index i + length 2^0=1
    for (int j = 1; (1<<j) <= n; j++)
      for (int i = 0; i + (1<<j) - 1 < n; i++)
        SpT[i][j] = min(SpT[i][j-1], SpT[i+(1<<(j-1))][j-1]);
  }
  int query(int i, int j) {
    int k = (int)floor(log((double)j-i+1) / log(2.0));    // 2^k <= (j-i+1)
    return min(SpT[i][k], SpT[j-(1<<k)+1][k]);
}
};
RMQ q1,q2;
double fat[1000010];
int show[1000010];
int main() {
	int n,k;
	fat[0] =1.0;
	for(int i = 1;i<=1000009;i++)
		fat[i] = fat[i-1] + (log2(i));

	scanf("%d %d",&n,&k);

	for(int i = 0;i<n;i++){
		scanf("%d",&v[i]);
		v[i]*=-100LL;
	}
	for(int j = 0;j<n;j++)
		scanf("%d",&c[j]);
	q1.build(n,v);
	q2.build(n,c);

	for(int i = 0;i<n;i++){
		long long lo = i,hi = n-1;
		while(lo<hi){
			long long mid = (lo+hi+1)/2;
			pair<int,int> xd = make_pair(-q1.query(i,mid),q2.query(i,mid));//query(1,0,n-1,i,mid);
			if(xd.first<=xd.second)
				lo = mid;
			else
				hi = mid-1;
		}

		pair<int,int> ae =  make_pair(-q1.query(i,lo),q2.query(i,lo));//query(1,0,n-1,i,lo);
		pair<int,int> ae2;
		if(lo+1==n)ae2 = ae;
		else ae2 = make_pair(-q1.query(i,lo+1),q2.query(i,lo+1));
		int x1 = min(ae.first,ae.second),x2 = min(ae2.first,ae2.second);
		if(x1>x2)
			show[i] = (x1);
		else
			show[i] = (x2);
	}
	double ans = 0.0;
	sort(show,show+n);
	double aux = log2(k);
	for(int i = 0;i<=min(100,n-k);i++){
		double xd = pow(2,fat[n-i-1]+fat[n-k]+aux-fat[n-i-k]-fat[n]);
		ans+=show[i]*xd;
	}

	printf("%.10lf\n",((double) ans));
	return 0;
}


#include <bits/stdc++.h>

using namespace std;

int v[1000010];
int c[1000010];

#define MAX_N 1000010                           // adjust this value as needed
#define LOG_TWO_N 20                           // 2^10 > 1000, adjust this value as needed
#define EPS 1e-20
struct RMQ {                                          // Range Minimum Query
  int SpT[MAX_N][LOG_TWO_N];
  RMQ(){};
  void build(int n, int *A) {
    for (int i = 0; i < n; i++) SpT[i][0] = A[i]; // RMQ of sub array starting at index i + length 2^0=1
    for (int j = 1; (1<<j) <= n; j++)
      for (int i = 0; i + (1<<j) - 1 < n; i++)
        SpT[i][j] = min(SpT[i][j-1], SpT[i+(1<<(j-1))][j-1]);
  }
  int query(int i, int j) {
    int k = (int)floor(log2f((double)j-i+1));    // 2^k <= (j-i+1)
    return min(SpT[i][k], SpT[j-(1<<k)+1][k]);
}
};
RMQ q1,q2;
double fat[1000010];
int show[1000010];
int main() {
	int n,k;
	fat[0] =1.0;
	for(int i = 1;i<=1000009;i++)
		fat[i] = fat[i-1] + (log2(i));

	scanf("%d %d",&n,&k);

	for(int i = 0;i<n;i++){
		scanf("%d",&v[i]);
		v[i]*=-100LL;
	}
	for(int j = 0;j<n;j++)
		scanf("%d",&c[j]);
	q1.build(n,v);
	q2.build(n,c);

	for(int i = 0;i<n;i++){
		long long lo = i,hi = n-1;
		while(lo<hi){
			long long mid = (lo+hi+1)/2;
			int ma = -q1.query(i,mid);
			int me = q2.query(i,mid);//query(1,0,n-1,i,mid);
			if(ma<=me)
				lo = mid;
			else
				hi = mid-1;
		}

		int x1 =  min(-q1.query(i,lo),q2.query(i,lo));//query(1,0,n-1,i,lo);
		int x2;
		if(lo+1==n)x2 = x1;
		else x2 = min(-q1.query(i,lo+1),q2.query(i,lo+1));
		if(x1>x2)
			show[i] = (x1);
		else
			show[i] = (x2);
	}
	double ans = 0.0;
	sort(show,show+n);
	double aux = log2f(k);
	for(int i = 0;i<=n-k;i++){
		double xd = powf(2,fat[n-i-1]+fat[n-k]+aux-fat[n-i-k]-fat[n]);
		ans+=show[i]*xd;
	}

	printf("%.10lf\n",((double) ans));
	return 0;
}


#include <bits/stdc++.h>

using namespace std;
int v[1000010];
int c[1000010];
double fat[1000010];
int show[1000010];
int main() {
	int n,k;
	fat[0] =1.0;
	for(int i = 1;i<=1000009;i++)
		fat[i] = fat[i-1] + (log(i));
	scanf("%d %d",&n,&k);
	for(int i = 0;i<n;i++){
		scanf("%d",&v[i]);
		v[i]*=100LL;
	}
	for(int j = 0;j<n;j++)
		scanf("%d",&c[j]);

	show[n-1] = min(v[n-1],c[n-1]);
	for(int i = n-2;i>=0;i--)
		show[i] = min(max(show[i+1],v[i]),c[i]);
	double ans = 0.0;
	sort(show,show+n);
	double aux = log(k);
	for(int i = 0;i<=min(1000,n-k);i++)
		ans+=show[i]*exp(fat[n-i-1]+fat[n-k]+aux-fat[n-i-k]-fat[n]);
	printf("%.10lf\n",ans);
	return 0;
}


#include <bits/stdc++.h>

using namespace std;

long long v[1000010];
long long c[1000010];
long long st1[1000010],st2[1000010];
int n,k;
void build(int at,int l, int r){
	if(l == r){
		st1[at] = v[l];
		st2[at] = c[l];
		return ;
	}
	int mid = (l+r)/2;
	int nxt = at*2;
	build(nxt,l,mid);
	build(nxt+1,mid+1,r);
	st1[at] = max(st1[nxt],st1[nxt+1]);
	st2[at] = min(st2[nxt],st2[nxt+1]);
}

pair<long long,long long> query(int at, int l, int r, int i, int j){
	if(j<l || i>r)
		return make_pair(-100000000000000000ll,100000000000000000ll);
	if(l>=i && r<=j)
		return make_pair(st1[at],st2[at]);
	pair<long long,long long> a, b;
	int mid = (l+r)/2;
	int nxt = at*2;
	a = query(nxt,l,mid,i,j);
	b = query(nxt+1,mid+1,r,i,j);
	return make_pair(max(a.first,b.first),min(a.second,b.second));
}

long double fat[1000010];

int main() {

	fat[0] =1.0;
	for(int i = 1;i<=1000009;i++)
		fat[i] = fat[i-1] + (logl(i));

	scanf("%d %d",&n,&k);

	for(int i = 0;i<n;i++){
		scanf("%lld",&v[i]);
		v[i]*=100LL;
	}
	for(int j = 0;j<n;j++)
		scanf("%lld",&c[j]);
	build(1,0,n-1);
	vector<pair<long long,int> > show;
	for(int i = 0;i<n;i++){
		int lo = i,hi = n-1;
		while(lo<hi){
			int mid = (lo+hi+1)/2;
			pair<long long,long long> xd = query(1,0,n-1,i,mid);
			if(xd.first<=xd.second)
				lo = mid;
			else
				hi = mid-1;
		}

		pair<long long,long long> ae =  query(1,0,n-1,i,lo);

		show.push_back(make_pair(min(ae.first,ae.second),i));
	}
	long double ans = 0.0;
	sort(show.begin(),show.end());
	long double aux = logl(k);
	for(int i = 0;i<=n-k;i++)
		ans+=show[i].first*expl(fat[n-i-1]+fat[n-k]+aux - fat[n-i-k]-fat[n]);

	printf("%.10lf\n",((double) ans));
	return 0;
}


#include <bits/stdc++.h>

using namespace std;
int v[1000010];
int c[1000010];
double fat[1000010];
int show[1000010];
int main() {
	int n,k;
	fat[0] =1.0;
	for(int i = 1;i<=1000009;i++)
		fat[i] = fat[i-1] + (log(i));
	scanf("%d %d",&n,&k);
	for(int i = 0;i<n;i++){
		scanf("%d",&v[i]);
		v[i]*=100LL;
	}
	for(int j = 0;j<n;j++)
		scanf("%d",&c[j]);

	show[n-1] = min(v[n-1],c[n-1]);
	for(int i = n-2;i>=0;i--)
		show[i] = min(max(show[i+1],v[i]),c[i]);
	double ans = 0.0;
	sort(show,show+n);
	double aux = log(k);
	for(int i = 0;i<=min(100,n-k);i++)
		ans+=show[i]*exp(fat[n-i-1]+fat[n-k]+aux-fat[n-i-k]-fat[n]);
	printf("%.10lf\n",ans);
	return 0;
}


#include <bits/stdc++.h>
#define getcx getchar_unlocked

 inline void inp( int &n )
 {
    n=0;
    int ch=getcx();int sign=1;
    while( ch < '0' || ch > '9' ){if(ch=='-')sign=-1; ch=getcx();}

    while(  ch >= '0' && ch <= '9' )
            n = (n<<3)+(n<<1) + ch-'0', ch=getcx();
    n=n*sign;
  }
using namespace std;
int v[1000010];
int c[1000010];
double fat[1000010];
int show[1000010];
int main() {
	int n,k;
	fat[0] =1.0;
	for(int i = 1;i<=1000009;i++)
		fat[i] = fat[i-1] + (log(i));
	inp(n);inp(k);
	for(int i = 0;i<n;i++){
		inp(v[i]);
		v[i]*=100LL;
	}
	for(int j = 0;j<n;j++)
		inp(c[j]);
	show[n-1] = min(v[n-1],c[n-1]);
	for(int i = n-2;i>=0;i--)
		show[i] = min(max(show[i+1],v[i]),c[i]);
	double ans = 0.0;
	sort(show,show+n);
	double aux = log(k);
	for(int i = 0;i<=n-k;i++)
		ans+=show[i]*exp(fat[n-i-1]+fat[n-k]+aux-fat[n-i-k]-fat[n]);
	printf("%.10lf\n",ans);
	return 0;
}


#include <bits/stdc++.h>

using namespace std;
int v[1000010];
int c[1000010];
double fat[1000010];
int show[1000010];
int main() {
	int n,k;
	fat[0] =1.0;
	for(int i = 1;i<=1000009;i++)
		fat[i] = fat[i-1] + (log(i));
	scanf("%d %d",&n,&k);
	for(int i = 0;i<n;i++){
		scanf("%d",&v[i]);
		v[i]*=100LL;
	}
	for(int j = 0;j<n;j++)
		scanf("%d",&c[j]);

	show[n-1] = min(v[n-1],c[n-1]);
	for(int i = n-2;i>=0;i--)
		show[i] = min(max(show[i+1],v[i]),c[i]);
	double ans = 0.0;
	sort(show,show+n);
	double aux = log(k);
	for(int i = 0;i<=min(500,n-k);i++)
		ans+=show[i]*exp(fat[n-i-1]+fat[n-k]+aux-fat[n-i-k]-fat[n]);
	printf("%.10lf\n",ans);
	return 0;
}


#include <bits/stdc++.h>

using namespace std;

int v[1000010];
int c[1000010];

#define MAX_N 1000010                           // adjust this value as needed
#define LOG_TWO_N 20                           // 2^10 > 1000, adjust this value as needed
#define EPS 1e-20
struct RMQ {                                          // Range Minimum Query
  int SpT[MAX_N][LOG_TWO_N];
  RMQ(){};
  void build(int n, int *A) {
    for (int i = 0; i < n; i++) SpT[i][0] = A[i]; // RMQ of sub array starting at index i + length 2^0=1
    for (int j = 1; (1<<j) <= n; j++)
      for (int i = 0; i + (1<<j) - 1 < n; i++)
        SpT[i][j] = min(SpT[i][j-1], SpT[i+(1<<(j-1))][j-1]);
  }
  int query(int i, int j) {
    int k = (int)floor(log((double)j-i+1) / log(2.0));    // 2^k <= (j-i+1)
    return min(SpT[i][k], SpT[j-(1<<k)+1][k]);
}
};
RMQ q1,q2;
double fat[1000010];
int show[1000010];
int main() {
	int n,k;
	fat[0] =1.0;
	for(int i = 1;i<=1000009;i++)
		fat[i] = fat[i-1] + (log2(i));

	scanf("%d %d",&n,&k);

	for(int i = 0;i<n;i++){
		scanf("%d",&v[i]);
		v[i]*=-100LL;
	}
	for(int j = 0;j<n;j++)
		scanf("%d",&c[j]);
	q1.build(n,v);
	q2.build(n,c);

	for(int i = 0;i<n;i++){
		long long lo = i,hi = n-1;
		while(lo<hi){
			long long mid = (lo+hi+1)/2;
			int ma = -q1.query(i,mid);
			int me = q2.query(i,mid);//query(1,0,n-1,i,mid);
			if(ma<=me)
				lo = mid;
			else
				hi = mid-1;
		}

		int x1 =  min(-q1.query(i,lo),q2.query(i,lo));//query(1,0,n-1,i,lo);
		int x2;
		if(lo+1==n)x2 = x1;
		else x2 = min(-q1.query(i,lo+1),q2.query(i,lo+1));
		if(x1>x2)
			show[i] = (x1);
		else
			show[i] = (x2);
	}
	double ans = 0.0;
	sort(show,show+n);
	double aux = log2(k);
	for(int i = 0;i<=min(100,n-k);i++){
		double xd = pow(2,fat[n-i-1]+fat[n-k]+aux-fat[n-i-k]-fat[n]);
		ans+=show[i]*xd;
	}

	printf("%.10lf\n",((double) ans));
	return 0;
}


#include <bits/stdc++.h>

using namespace std;

long long v[1000010];
long long c[1000010];

#define MAX_N 1000010                           // adjust this value as needed
#define LOG_TWO_N 22                           // 2^10 > 1000, adjust this value as needed

struct RMQ {                                          // Range Minimum Query
  long long SpT[MAX_N][LOG_TWO_N];
  RMQ(){};
  void build(int n, long long *A) {
    for (int i = 0; i < n; i++) SpT[i][0] = A[i]; // RMQ of sub array starting at index i + length 2^0=1
    for (int j = 1; (1<<j) <= n; j++)
      for (int i = 0; i + (1<<j) - 1 < n; i++)
        SpT[i][j] = min(SpT[i][j-1], SpT[i+(1<<(j-1))][j-1]);
  }
  long long query(int i, int j) {
    int k = (int)floor(log((double)j-i+1) / log(2.0));    // 2^k <= (j-i+1)
    return min(SpT[i][k], SpT[j-(1<<k)+1][k]);
}
};
RMQ q1,q2;
long double fat[1000010];

int main() {
	int n,k;
	fat[0] =1.0;
	for(int i = 1;i<=1000009;i++)
		fat[i] = fat[i-1] + (logl(i));

	scanf("%d %d",&n,&k);

	for(int i = 0;i<n;i++){
		scanf("%lld",&v[i]);
		v[i]*=-100LL;
	}
	for(int j = 0;j<n;j++)
		scanf("%lld",&c[j]);
	q1.build(n,v);
	q2.build(n,c);

	vector<pair<long long,int> > show;
	for(int i = 0;i<n;i++){
		int lo = i,hi = n-1;
		while(lo<hi){
			int mid = (lo+hi+1)/2;
			pair<long long,long long> xd = make_pair(-q1.query(i,mid),q2.query(i,mid));//query(1,0,n-1,i,mid);
			if(xd.first<=xd.second)
				lo = mid;
			else
				hi = mid-1;
		}

		pair<long long,long long> ae =  make_pair(-q1.query(i,lo),q2.query(i,lo));//query(1,0,n-1,i,lo);
		pair<long long,long long> ae2;
		if(lo+1==n)ae2 = ae;
		else ae2 = make_pair(-q1.query(i,lo+1),q2.query(i,lo+1));

		if(min(ae.first,ae.second)>min(ae2.first,ae2.second))
			show.push_back(make_pair(min(ae.first,ae.second),i));
		else
			show.push_back(make_pair(min(ae2.first,ae2.second),i));
	}
	long double ans = 0.0;
	sort(show.begin(),show.end());
	long double aux = logl(k);
	for(int i = 0;i<=n-k;i++)
		ans+=show[i].first*expl(fat[n-i-1]+fat[n-k]+aux - fat[n-i-k]-fat[n]);

	printf("%.10lf\n",((double) ans));
	return 0;
}


#include <bits/stdc++.h>

using namespace std;
const int maxn = 1e6 + 50;
int n , k , v[maxn] , c[maxn] , val[maxn] , nxt[maxn] , rmq[maxn][25] , rmq2[maxn][25] , to[maxn];
stack < int > S;

void build_rmq(){
	for(int i = 0 ; i <= n ; ++ i) rmq[i][0] = v[i] , rmq2[i][0] = c[i];
	for(int j = 1 ; j <= 24 ; ++ j)
		for(int i = 0 ; i <= n ; ++ i)
			if( i + (1 << j) - 1 <= n )
				rmq[i][j] = max( rmq[i][j-1] , rmq[i + (1 << (j-1)) ][j - 1] ) , rmq2[i][j] = min( rmq2[i][j-1] , rmq2[i + (1 << (j-1) ) ][j - 1] );
}

int query( int l , int r ){
	int res = - 1e9;
	for(int i = 24 ; i >= 0 ; -- i) if( l + ( 1 << i ) - 1 <= r ) res = max( res , rmq[l][i] ) , l += ( 1 << i ) ;
	return res;
}

int query2( int l , int r ){
	int res =  1e9;
	for(int i = 24 ; i >= 0 ; -- i) if( l + ( 1 << i ) - 1 <= r ) res = min( res , rmq2[l][i] ) , l += ( 1 << i ) ;
	return res;
}

int main(int argc,char *argv[]){
	scanf("%d%d",&n,&k);
	for(int i = 0 ; i < n ; ++ i) scanf("%d" , v + i );
	for(int i = 0 ; i < n ; ++ i) scanf("%d" , c + i );
	c[n] = 1e9;
	build_rmq();
    for(int i = 0 ; i < n  ; ++ i){
    	int l = i , r = n - 1 , nxt = i;
    	while( l < r ){
    		int mid = l + ( ( r - l + 1 ) >> 1);
    		if(query2( i , mid ) >= c[i] ) l = mid , nxt = l;
    		else r = mid - 1;
    	}
    	int maxv = query( i , nxt ) * 100;
    	to[i] = nxt;
    	val[i] = min( maxv , c[i] );
    }
    for(int i = n - 1 ; i >= 0 ; -- i) val[i] = max( val[i] , val[ to[i] + 1 ] );
    sort( val , val + n );
    double X = (double)k/(double)n , ans = X*val[0];
    for(int i = 2 ; i <= n - k + 1 ; ++ i){
    	X = X * ((double)(n-k-i+2)/(double)(n-i+1));
    	ans += X*val[i - 1];
    }
    printf("%.12lf\n" , ans );
	return 0;
}


#include <bits/stdc++.h>

using namespace std;
const int maxn = 1e6 + 50;
int n , k , v[maxn] , c[maxn] , maxv[maxn] , minc[maxn] , val[maxn];

int main(int argc,char *argv[]){
	scanf("%d%d",&n,&k);
	for(int i = 1 ; i <= n ; ++ i) scanf("%d" , v + i );
	for(int i = 1 ; i <= n ; ++ i) scanf("%d" , c + i );
	maxv[n] = v[n] , minc[n] = c[n];
    for(int i = n - 1 ; i >= 1 ; -- i) maxv[i] = max( maxv[ i + 1 ] , v[i] ) , minc[i] = min( minc[i + 1] , c[i] );
    for(int i = 1 ; i <= n ; ++ i){
    	int A = min( 100 * v[i] , c[i] );
    	int B = min( 100 * maxv[i] , minc[i] );
    	val[i] = max( A , B );
    }
    sort( val + 1 , val + n + 1 );
   // for(int i = 1 ; i <= n ; ++ i) cout <<val[i] << " ";cout << endl;
    double X = (double)k/(double)n , ans = X*val[1];
    for(int i = 2 ; i <= n - k + 1 ; ++ i){
    	X = X * (double)(n-k-i+2)/(double)(n-i+1);
    //	cout << "i is " << i << " X is " << X << endl;
    	ans += X*val[i];
    }
    printf("%.12lf\n" , ans );
	return 0;
}


#include <bits/stdc++.h>

using namespace std;
const int maxn = 1e6 + 50;
int n , k , v[maxn] , c[maxn] , val[maxn] , nxt[maxn] , rmq[maxn][25] , rmq2[maxn][25];
stack < int > S;

void build_rmq(){
	for(int i = 0 ; i <= n ; ++ i) rmq[i][0] = v[i] , rmq[i][1] = c[i];
	for(int j = 1 ; j <= 24 ; ++ j)
		for(int i = 0 ; i <= n ; ++ i)
			if( i + (1 << j) - 1 <= n )
				rmq[i][j] = max( rmq[i][j-1] , rmq[i + (1 << (j-1)) ][j - 1] ) , rmq2[i][j] = min( rmq2[i][j-1] , rmq2[i + (1 << (j-1) ) ][j - 1] );
}

int query( int l , int r ){
	int res = - 1e9;
	for(int i = 24 ; i >= 0 ; -- i) if( l + ( 1 << i ) - 1 <= r ) res = max( res , rmq[l][i] ) , l += ( 1 << i ) ;
	return res;
}

int query2( int l , int r ){
	int res =  1e9;
	for(int i = 24 ; i >= 0 ; -- i) if( l + ( 1 << i ) - 1 <= r ) res = min( res , rmq2[l][i] ) , l += ( 1 << i ) ;
	return res;
}

int main(int argc,char *argv[]){
	scanf("%d%d",&n,&k);
	for(int i = 0 ; i < n ; ++ i) scanf("%d" , v + i );
	for(int i = 0 ; i < n ; ++ i) scanf("%d" , c + i );
	c[n] = 1e9;
	build_rmq();
    for(int i = 0 ; i < n  ; ++ i){
    	int l = i , r = n - 1 , nxt = i;
    	while( l < r ){
    		int mid = l + ( ( r - l + 1 ) >> 1);
    		if(query2( l , mid ) >= c[i] ) l = mid , nxt = l;
    		else r = mid - 1;
    	}
    	int maxv = query( i , nxt ) * 100;
    	val[i] = min( maxv , c[i] );
    }
    sort( val , val + n );
    double X = (double)k/(double)n , ans = X*val[0];
    for(int i = 2 ; i <= n - k + 1 ; ++ i){
    	X = X * ((double)(n-k-i+2)/(double)(n-i+1));
    	ans += X*val[i - 1];
    }
    printf("%.12lf\n" , ans );
	return 0;
}


#include <bits/stdc++.h>

using namespace std;
const int maxn = 1e6 + 50;
int n , k , v[maxn] , c[maxn] , val[maxn] , nxt[maxn] , rmq[maxn][25] , rmq2[maxn][25];
stack < int > S;

void build_rmq(){
	for(int i = 0 ; i <= n ; ++ i) rmq[i][0] = v[i] , rmq[i][1] = c[i];
	for(int j = 1 ; j <= 24 ; ++ j)
		for(int i = 0 ; i <= n ; ++ i)
			if( i + (1 << j) - 1 <= n )
				rmq[i][j] = max( rmq[i][j-1] , rmq[i + (1 << (j-1)) ][j - 1] ) , rmq2[i][j] = min( rmq2[i][j-1] , rmq2[i + (1 << (j-1) ) ][j - 1] );}

int query( int l , int r ){
	int res = - 1e9;
	for(int i = 24 ; i >= 0 ; -- i) if( l + ( 1 << i ) - 1 <= r ) res = max( res , rmq[l][i] ) , l += ( 1 << i ) ;
	return res;
}

int query2( int l , int r ){
	int res =  1e9;
	for(int i = 24 ; i >= 0 ; -- i) if( l + ( 1 << i ) - 1 <= r ) res = min( res , rmq2[l][i] ) , l += ( 1 << i ) ;
	return res;
}

int main(int argc,char *argv[]){
	scanf("%d%d",&n,&k);
	for(int i = 0 ; i < n ; ++ i) scanf("%d" , v + i );
	for(int i = 0 ; i < n ; ++ i) scanf("%d" , c + i );
	c[n] = 1e9;
	build_rmq();
    for(int i = 0 ; i < n  ; ++ i){
    	int l = i , r = n - 1 , nxt = i;
    	while( l < r ){
    		int mid = l + ( ( r - l + 1 ) >> 1);
    		if(query2( l , mid ) >= c[i] ) l = mid , nxt = l;
    		else r = mid - 1;
    	}
    	int maxv = query( i , nxt ) * 100;
    	val[i] = min( maxv , c[i] );
    }
    sort( val , val + n );
    double X = (double)k/(double)n , ans = X*val[0];
    for(int i = 2 ; i <= n - k + 1 ; ++ i){
    	X = X * (double)(n-k-i+2)/(double)(n-i+1);
    	ans += X*val[i - 1];
    }
    printf("%.12lf\n" , ans );
	return 0;
}


#include <bits/stdc++.h>

using namespace std;
const int maxn = 1e6 + 50;
int n , k , v[maxn] , c[maxn] , val[maxn] , nxt[maxn] , rmq[maxn][25] , rmq2[maxn][25] , to[maxn];
stack < int > S;

void build_rmq(){
	for(int i = 0 ; i <= n ; ++ i) rmq[i][0] = v[i] , rmq2[i][0] = c[i];
	for(int j = 1 ; j <= 24 ; ++ j)
		for(int i = 0 ; i <= n ; ++ i)
			if( i + (1 << j) - 1 <= n )
				rmq[i][j] = max( rmq[i][j-1] , rmq[i + (1 << (j-1)) ][j - 1] ) , rmq2[i][j] = min( rmq2[i][j-1] , rmq2[i + (1 << (j-1) ) ][j - 1] );
}

int query( int l , int r ){
	int res = - 1e9;
	for(int i = 24 ; i >= 0 ; -- i) if( l + ( 1 << i ) - 1 <= r ) res = max( res , rmq[l][i] ) , l += ( 1 << i ) ;
	return res;
}

int query2( int l , int r ){
	int res =  1e9;
	for(int i = 24 ; i >= 0 ; -- i) if( l + ( 1 << i ) - 1 <= r ) res = min( res , rmq2[l][i] ) , l += ( 1 << i ) ;
	return res;
}

int main(int argc,char *argv[]){
	scanf("%d%d",&n,&k);
	for(int i = 0 ; i < n ; ++ i) scanf("%d" , v + i );
	for(int i = 0 ; i < n ; ++ i) scanf("%d" , c + i );
	c[n] = 1e9;
	build_rmq();
    for(int i = 0 ; i < n  ; ++ i){
    	int l = i , r = n - 1 , nxt = i;
    	while( l < r ){
    		int mid = l + ( ( r - l + 1 ) >> 1);
    		if(query2( i , mid ) >= c[i] ) l = mid , nxt = l;
    		else r = mid - 1;
    	}
    	int maxv = query( i , nxt ) * 100;
    	to[i] = nxt;
    	val[i] = min( maxv , c[i] );
    }
    for(int i = n - 1 ; i >= 0 ; -- i) val[i] = max( val[i] , val[ to[i] + 1 ] );
    for(int i = 0 ; i < n ; ++ i) cout << val[i] << " ";cout << endl;
    sort( val , val + n );
    double X = (double)k/(double)n , ans = X*val[0];
    for(int i = 2 ; i <= n - k + 1 ; ++ i){
    	X = X * ((double)(n-k-i+2)/(double)(n-i+1));
    	ans += X*val[i - 1];
    }
    printf("%.12lf\n" , ans );
	return 0;
}


#include <bits/stdc++.h>

using namespace std;
const int maxn = 1e6 + 500;
int n , k , v[maxn] , c[maxn] , to[maxn] , dp[maxn] , rmq[maxn][21];
stack < int > S;

void build(){
	for(int i = 1 ; i <= n ; ++ i) rmq[i][0] = v[i];
	for(int j = 1 ; j <= 20 ; ++ j)
		for(int i = 1 ; i + ( 1 << j ) - 1 <= n ; ++ i)
			rmq[i][j] = max( rmq[i][j-1] , rmq[i + (1 << (j - 1))][j - 1] );
}

int query(int l , int r){
	int res = 0 ;
	for(int i = 20 ; i >= 0 ; -- i ) if( l + ( 1 << i ) - 1 <= r ) res = max( res , rmq[l][i] ), l += (1 << i);
	return res;
}

int main(int argc,char *argv[]){
	scanf("%d%d",&n,&k);
	for(int i = 1 ; i <= n ; ++ i) scanf("%d" , v + i );
	for(int i = 1 ; i <= n ; ++ i) scanf("%d" , c + i );
	S.push( n + 1 );
    for(int i = n ; i >= 1 ; -- i){
    	while(c[i] <= c[S.top()]) S.pop();
    	to[i] = S.top() - 1;
    	S.push( i );
    }
    build();
    for(int i = 1 ; i <= n ; ++ i) dp[i] = min( c[i] , query( i , to[i] ) * 100 );
    for(int i = n ; i >= 1 ; -- i) dp[i] = max( dp[i] , dp[ to[i] + 1 ] );
    sort( dp + 1 , dp + n + 1 );
    double X = (double)k/(double)n , ans = X*dp[1];
    for(int i = 2 ; i <= n - k + 1 ; ++ i){
    	X = X * ((double)(n-k-i+2)/(double)(n-i+1));
    	ans += X*dp[i];
    }
    printf("%.12lf\n" , ans );
	return 0;
}


#include <bits/stdc++.h>

using namespace std;
const int maxn = 1e6 + 50;
int n , k , v[maxn] , c[maxn] , val[maxn] , nxt[maxn] , rmq[maxn][25] , rmq2[maxn][25];
stack < int > S;

void build_rmq(){
	for(int i = 0 ; i <= n ; ++ i) rmq[i][0] = v[i] , rmq[i][1] = c[i];
	for(int j = 1 ; j <= 24 ; ++ j)
		for(int i = 0 ; i <= n ; ++ i)
			if( i + (1 << j) - 1 <= n )
				rmq[i][j] = max( rmq[i][j-1] , rmq[i + (1 << (j-1)) ][j - 1] ) , rmq2[i][j] = min( rmq2[i][j-1] , rmq2[i + (1 << (j-1) ) ][j - 1] );}

int query( int l , int r ){
	int res = - 1e9;
	for(int i = 24 ; i >= 0 ; -- i) if( l + ( 1 << i ) - 1 <= r ) res = max( res , rmq[l][i] ) , l += ( 1 << i ) ;
	return res;
}

int query2( int l , int r ){
	int res =  1e9;
	for(int i = 20 ; i >= 0 ; -- i) if( l + ( 1 << i ) - 1 <= r ) res = min( res , rmq2[l][i] ) , l += ( 1 << i ) ;
	return res;
}

int main(int argc,char *argv[]){
	scanf("%d%d",&n,&k);
	for(int i = 0 ; i < n ; ++ i) scanf("%d" , v + i );
	for(int i = 0 ; i < n ; ++ i) scanf("%d" , c + i );
	build_rmq();
    for(int i = 0 ; i < n  ; ++ i){
    	int l = i , r = n;
    	while( l < r ){
    		int mid = l + ( ( r - l + 1 ) >> 1);
    		if(query2( l , mid ) >= c[i] ) l = mid;
    		else r = mid - 1;
    	}
    	int maxv = query( i , l ) * 100;
    	val[i] = min( maxv , c[i] );
    }
    sort( val , val + n );
    double X = (double)k/(double)n , ans = X*val[0];
    for(int i = 2 ; i <= n - k + 1 ; ++ i){
    	X = X * (double)(n-k-i+2)/(double)(n-i+1);
    	ans += X*val[i - 1];
    }
    printf("%.12lf\n" , ans );
	return 0;
}


#include <bits/stdc++.h>

using namespace std;
const int maxn = 1e6 + 500;
int n , k , v[maxn] , c[maxn] , to[maxn] , dp[maxn] , rmq[maxn][21];
stack < int > S;

void build(){
	for(int i = 1 ; i <= n ; ++ i) rmq[i][0] = v[i];
	for(int j = 1 ; j <= n ; ++ j)
		for(int i = 1 ; i + ( 1 << j ) - 1 <= n ; ++ i)
			rmq[i][j] = max( rmq[i][j-1] , rmq[i + (1 << (j - 1))][j - 1] );
}

int query(int l , int r){
	int res = 0 ;
	for(int i = 20 ; i >= 0 ; -- i ) if( l + ( 1 << i ) - 1 <= r ) res = max( res , rmq[l][i] ), l += (1 << i);
	return res;
}

int main(int argc,char *argv[]){
	scanf("%d%d",&n,&k);
	for(int i = 1 ; i <= n ; ++ i) scanf("%d" , v + i );
	for(int i = 1 ; i <= n ; ++ i) scanf("%d" , c + i );
	S.push( n + 1 );
    for(int i = n ; i >= 1 ; -- i){
    	while(c[i] <= c[S.top()]) S.pop();
    	to[i] = S.top() - 1;
    	S.push( i );
    }
    build();
    for(int i = 1 ; i <= n ; ++ i) dp[i] = min( c[i] , query( i , to[i] ) * 100 );
    for(int i = n ; i >= 1 ; -- i) dp[i] = max( dp[i] , dp[ to[i] + 1 ] );
    sort( dp + 1 , dp + n + 1 );
    double X = (double)k/(double)n , ans = X*dp[1];
    for(int i = 2 ; i <= n - k + 1 ; ++ i){
    	X = X * ((double)(n-k-i+2)/(double)(n-i+1));
    	ans += X*dp[i];
    }
    printf("%.12lf\n" , ans );
	return 0;
}


#include <bits/stdc++.h>

using namespace std;
const int maxn = 1e6 + 50;
int n , k , v[maxn] , c[maxn] , val[maxn] , nxt[maxn] , rmq[maxn][25] , rmq2[maxn][25];
stack < int > S;

void build_rmq(){
	for(int i = 0 ; i <= n ; ++ i) rmq[i][0] = v[i] , rmq[i][1] = c[i];
	for(int j = 1 ; j <= 24 ; ++ j)
		for(int i = 0 ; i <= n ; ++ i)
			if( i + (1 << j) - 1 <= n )
				rmq[i][j] = max( rmq[i][j-1] , rmq[i + (1 << (j-1)) ][j - 1] ) , rmq2[i][j] = min( rmq2[i][j-1] , rmq2[i + (1 << (j-1) ) ][j - 1] );}

int query( int l , int r ){
	int res = - 1e9;
	for(int i = 24 ; i >= 0 ; -- i) if( l + ( 1 << i ) - 1 <= r ) res = max( res , rmq[l][i] ) , l += ( 1 << i ) ;
	return res;
}

int query2( int l , int r ){
	int res =  1e9;
	for(int i = 20 ; i >= 0 ; -- i) if( l + ( 1 << i ) - 1 <= r ) res = min( res , rmq2[l][i] ) , l += ( 1 << i ) ;
	return res;
}

int main(int argc,char *argv[]){
	scanf("%d%d",&n,&k);
	for(int i = 0 ; i < n ; ++ i) scanf("%d" , v + i );
	for(int i = 0 ; i < n ; ++ i) scanf("%d" , c + i );
	build_rmq();
    for(int i = 0 ; i < n  ; ++ i){
    	int l = i , r = n , nxt = i;
    	while( l < r ){
    		int mid = l + ( ( r - l + 1 ) >> 1);
    		if(query2( l , mid ) >= c[i] ) l = mid , nxt = l;
    		else r = mid - 1;
    	}
    	int maxv = query( i , nxt ) * 100;
    	val[i] = min( maxv , c[i] );
    }
    sort( val , val + n );
    double X = (double)k/(double)n , ans = X*val[0];
    for(int i = 2 ; i <= n - k + 1 ; ++ i){
    	X = X * (double)(n-k-i+2)/(double)(n-i+1);
    	ans += X*val[i - 1];
    }
    printf("%.12lf\n" , ans );
	return 0;
}


#include <ctime>
#include <iostream>
#include <vector>
#include <cstdio>
#include <string>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <map>
#include <set>
#include <assert.h>
using namespace std;
#define FOR(i,a,b) for (int i = a; i < b; ++i)
#define RFOR(i,a,b) for(int i = a; i >= b;--i)
#define REP(i, n) FOR(i, 0, n)
#define rep(i,n) REP(i,n)
#define forn(i,a,b) FOR(i,a,b)
#define rfor(i,a,b) RFOR(i,a,b)
#define x first
#define y second
#define fmin asjfklasjflkjaskfl
#define fmax asklfklsfksofoisfio
#define ll long long
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define sz(f) (int)f.size()
#define vi vector < int >
#define db(x) cerr << #x << " = " << x << endl
#define db2(x, y) cerr << "(" << #x << ", " << #y << ") = (" << x << ", " << y << ")\n";
#define y1 jaksflkajsf
#define pii pair<int,int>
#define pli pair<ll,int>
#define ld long double
const ll INF = 1e18;
const int inf = 1e9;
const double PI = acos(-1.0);
const int MOD = 1000000000+7;
const int N = 1e6+5;
int n, k;
int v[N], c[N];
int res[N];
int st2[N];
int fmin[21][N], fmax[21][N];
int getMax(int l, int r) {
	int len = r - l + 1;
	int j = st2[len];
	return max(fmax[j][l], fmax[j][r - (1 << j) + 1]);
}
int getMin(int l, int r) {
	int len = r - l + 1;
	int j = st2[len];
	return min(fmin[j][l], fmin[j][r - (1 << j) + 1]);
}
bool can(int pos, int value) {
	if (c[pos] < value)
		return false;
	if (getMax(pos, n - 1) < value)
		return false;
	// find first for max
	int left = pos - 1, right = n - 1;
	while (left + 1 < right) {
		int m = (left + right) >> 1;
		if (getMax(pos, m) >= value)
			right = m;
		else
			left = m;
	}
	int best = right;
	left = pos, right = n;
	while (left + 1 < right) {
		int m = (left + right) >> 1;
		if (right <= best)
			break;
		if (getMin(pos, m) >= value)
			left = m;
		else
			right = m;
	}
	if (left < best)
		return false;
	return true;
}
int main() {
	//freopen("input.txt","r",stdin);
	//freopen("output.txt","w",stdout);
	scanf("%d%d", &n, &k);
	int it = 0;
	REP(i, n + 1) {
		while ((1 << it) <= i)it++;
		st2[i] = it - 1;
	}
	REP(i, n) {
		scanf("%d", &v[i]);
		v[i] *= 100;
		fmax[0][i] = v[i];
	}
	REP(i, n) {
		scanf("%d", &c[i]);
		fmin[0][i] = c[i];
	}
	FOR(i, 1, 20) {
		REP(j, n) {
			fmin[i][j] = fmin[i - 1][j];
			fmax[i][j] = fmax[i - 1][j];
			if (j + (1 << (i - 1)) < n) {
				fmin[i][j] = min(fmin[i][j], fmin[i - 1][j + (1 << (i - 1))]);
				fmax[i][j] = max(fmax[i][j], fmax[i - 1][j + (1 << (i - 1))]);
			}
		}
	}
	REP(i, n) {
		int left = 0, right = c[i] + 1;
		while (left + 1 < right) {
			int m = (left + right) >> 1;
			if (can(i, m))
				left = m;
			else
				right = m;
		}
		res[i] = left;
	}
	sort(res, res + n);
	ld ans = 0;
	ld cur = 1.0 * k / n;
    REP(i, n) {
		if (i + k - 1 >= n || abs(cur)<1e-30)
			break;
		ans += cur * res[i];
		cur /= (n - i - 1);
		cur *= (n - k - i);
        //cur *= (long double)1.0  / (n - 1 - i) * (n - k - i);
    }
	cout.precision(15);
	cout << fixed << ans << endl;
	return 0;
}


#include <ctime>
#include <iostream>
#include <vector>
#include <cstdio>
#include <string>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <map>
#include <set>
#include <assert.h>
using namespace std;
#define FOR(i,a,b) for (int i = a; i < b; ++i)
#define RFOR(i,a,b) for(int i = a; i >= b;--i)
#define REP(i, n) FOR(i, 0, n)
#define rep(i,n) REP(i,n)
#define forn(i,a,b) FOR(i,a,b)
#define rfor(i,a,b) RFOR(i,a,b)
#define x first
#define y second
#define fmin asjfklasjflkjaskfl
#define fmax asklfklsfksofoisfio
#define ll long long
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define sz(f) (int)f.size()
#define vi vector < int >
#define db(x) cerr << #x << " = " << x << endl
#define db2(x, y) cerr << "(" << #x << ", " << #y << ") = (" << x << ", " << y << ")\n";
#define y1 jaksflkajsf
#define pii pair<int,int>
#define pli pair<ll,int>
#define ld long double
const ll INF = 1e18;
const int inf = 1e9;
const double PI = acos(-1.0);
const int MOD = 1000000000+7;
const int N = 1e6+5;
int n, k;
int v[N], c[N];
int res[N];
int st2[N];
int fmin[21][N], fmax[21][N];
inline int getMax(int l, int r) {
	int len = r - l + 1;
	int j = st2[len];
	return max(fmax[j][l], fmax[j][r - (1 << j) + 1]);
}
inline int getMin(int l, int r) {
	int len = r - l + 1;
	int j = st2[len];
	return min(fmin[j][l], fmin[j][r - (1 << j) + 1]);
}
bool can(int pos, int value) {
	if (c[pos] < value)
		return false;
	if (getMax(pos, n - 1) < value)
		return false;
	// find first for max
	int left = pos - 1, right = n - 1;
	while (left + 1 < right) {
		int m = (left + right) >> 1;
		if (getMax(pos, m) >= value)
			right = m;
		else
			left = m;
	}
	return getMin(pos, right) >= value;
	int best = right;
	left = pos, right = best + 2;
	while (left + 1 < right) {
		int m = (left + right) >> 1;
		if (getMin(pos, m) >= value)
			left = m;
		else
			right = m;
	}
	if (left < best)
		return false;
	return true;
}
int main() {
	//freopen("input.txt","r",stdin);
	//freopen("output.txt","w",stdout);
	scanf("%d%d", &n, &k);
	int it = 0;
	REP(i, n + 1) {
		while ((1 << it) <= i)it++;
		st2[i] = it - 1;
	}
	REP(i, n) {
		scanf("%d", &v[i]);
		v[i] *= 100;
		fmax[0][i] = v[i];
	}
	REP(i, n) {
		scanf("%d", &c[i]);
		fmin[0][i] = c[i];
	}
	FOR(i, 1, 20) {
		REP(j, n) {
			fmin[i][j] = fmin[i - 1][j];
			fmax[i][j] = fmax[i - 1][j];
			if (j + (1 << (i - 1)) < n) {
				fmin[i][j] = min(fmin[i][j], fmin[i - 1][j + (1 << (i - 1))]);
				fmax[i][j] = max(fmax[i][j], fmax[i - 1][j + (1 << (i - 1))]);
			}
		}
	}
	REP(i, n) {
		int left = 0, right = c[i] + 1;
		while (left + 1 < right) {
			int m = (left + right) >> 1;
			if (can(i, m))
				left = m;
			else
				right = m;
		}
		res[i] = left;
	}
	sort(res, res + n);
	ld ans = 0;
	ld cur = 1.0 * k / n;
    REP(i, n) {
		if (i + k - 1 >= n || abs(cur)<1e-30)
			break;
		ans += cur * res[i];
		cur /= (n - i - 1);
		cur *= (n - k - i);
        //cur *= (long double)1.0  / (n - 1 - i) * (n - k - i);
    }
	cout.precision(15);
	cout << fixed << ans << endl;
	return 0;
}


#include <ctime>
#include <iostream>
#include <vector>
#include <cstdio>
#include <string>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <map>
#include <set>
#include <assert.h>
using namespace std;
#define FOR(i,a,b) for (int i = a; i < b; ++i)
#define RFOR(i,a,b) for(int i = a; i >= b;--i)
#define REP(i, n) FOR(i, 0, n)
#define rep(i,n) REP(i,n)
#define forn(i,a,b) FOR(i,a,b)
#define rfor(i,a,b) RFOR(i,a,b)
#define x first
#define y second
#define fmin asjfklasjflkjaskfl
#define fmax asklfklsfksofoisfio
#define ll long long
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define sz(f) (int)f.size()
#define vi vector < int >
#define db(x) cerr << #x << " = " << x << endl
#define db2(x, y) cerr << "(" << #x << ", " << #y << ") = (" << x << ", " << y << ")\n";
#define y1 jaksflkajsf
#define pii pair<int,int>
#define pli pair<ll,int>
#define ld long double
const ll INF = 1e18;
const int inf = 1e9;
const double PI = acos(-1.0);
const int MOD = 1000000000+7;
const int N = 1e6+5;
int n, k;
int v[N], c[N];
int res[N];
int st2[N];
int fmin[21][N], fmax[21][N];
int getMax(int l, int r) {
	int len = r - l + 1;
	int j = st2[len];
	return max(fmax[j][l], fmax[j][r - (1 << j) + 1]);
}
int getMin(int l, int r) {
	int len = r - l + 1;
	int j = st2[len];
	return max(fmin[j][l], fmin[j][r - (1 << j) + 1]);
}
bool can(int pos, int value) {
	if (c[pos] < value)
		return false;
	if (getMax(pos, n - 1) < value)
		return false;
	// find first for max
	int left = pos - 1, right = n - 1;
	while (left + 1 < right) {
		int m = (left + right) >> 1;
		if (getMax(pos, m) >= value)
			right = m;
		else
			left = m;
	}
	int best = right;
	left = pos, right = n;
	while (left + 1 < right) {
		int m = (left + right) >> 1;
		if (getMin(pos, m) >= value)
			left = m;
		else
			right = m;
	}
	if (left < best)
		return false;
	return true;
}
int main() {
	//freopen("input.txt","r",stdin);
	//freopen("output.txt","w",stdout);
	scanf("%d%d", &n, &k);
	int it = 0;
	REP(i, n + 1) {
		while ((1 << it) <= i)it++;
		st2[i] = it - 1;
	}
	REP(i, n) {
		scanf("%d", &v[i]);
		v[i] *= 100;
		fmax[0][i] = v[i];
	}
	REP(i, n) {
		scanf("%d", &c[i]);
		fmin[0][i] = c[i];
	}
	FOR(i, 1, 20) {
		REP(j, n) {
			fmin[i][j] = fmin[i - 1][j];
			fmax[i][j] = fmax[i - 1][j];
			if (i + (1 << (j - 1)) < n) {
				fmin[i][j] = min(fmin[i][j], fmin[i - 1][j + (1 << (j - 1))]);
				fmax[i][j] = max(fmax[i][j], fmax[i - 1][j + (1 << (j - 1))]);
			}
		}
	}
	REP(i, n) {
		int left = 0, right = 10000001;
		while (left + 1 < right) {
			int m = (left + right) >> 1;
			if (can(i, m))
				left = m;
			else
				right = m;
		}
		res[i] = left;
	}
	sort(res, res + n);
	ld ans = 0;
	ld cur = 1.0 * k / n;
    REP(i, n) {
		if (i + k - 1 >= n || abs(cur)<1e-30)
			break;
		ans += cur * res[i];
        cur *= (long double)1.0 * (n - k - i) / (n - 1 - i);
    }
	cout.precision(15);
	cout << fixed << ans << endl;
	return 0;
}


#include <ctime>
#include <iostream>
#include <vector>
#include <cstdio>
#include <string>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <map>
#include <set>
#include <assert.h>
using namespace std;
#define FOR(i,a,b) for (int i = a; i < b; ++i)
#define RFOR(i,a,b) for(int i = a; i >= b;--i)
#define REP(i, n) FOR(i, 0, n)
#define rep(i,n) REP(i,n)
#define forn(i,a,b) FOR(i,a,b)
#define rfor(i,a,b) RFOR(i,a,b)
#define x first
#define y second
#define fmin asjfklasjflkjaskfl
#define fmax asklfklsfksofoisfio
#define ll long long
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define sz(f) (int)f.size()
#define vi vector < int >
#define db(x) cerr << #x << " = " << x << endl
#define db2(x, y) cerr << "(" << #x << ", " << #y << ") = (" << x << ", " << y << ")\n";
#define y1 jaksflkajsf
#define pii pair<int,int>
#define pli pair<ll,int>
#define ld long double
const ll INF = 1e18;
const int inf = 1e9;
const double PI = acos(-1.0);
const int MOD = 1000000000+7;
const int N = 1e6+5;
int n, k;
int v[N], c[N];
int res[N];
int st2[N];
int fmin[21][N], fmax[21][N];
int getMax(int l, int r) {
	int len = r - l + 1;
	int j = st2[len];
	return max(fmax[j][l], fmax[j][r - (1 << j) + 1]);
}
int getMin(int l, int r) {
	int len = r - l + 1;
	int j = st2[len];
	return max(fmin[j][l], fmin[j][r - (1 << j) + 1]);
}
bool can(int pos, int value) {
	if (c[pos] < value)
		return false;
	if (getMax(pos, n - 1) < value)
		return false;
	// find first for max
	int left = pos - 1, right = n - 1;
	while (left + 1 < right) {
		int m = (left + right) >> 1;
		if (getMax(pos, m) >= value)
			right = m;
		else
			left = m;
	}
	int best = right;
	left = pos, right = n;
	while (left + 1 < right) {
		int m = (left + right) >> 1;
		if (getMin(pos, m) >= value)
			left = m;
		else
			right = m;
	}
	if (left < best)
		return false;
	return true;
}
int main() {
	//freopen("input.txt","r",stdin);
	//freopen("output.txt","w",stdout);
	scanf("%d%d", &n, &k);
	int it = 0;
	REP(i, n + 1) {
		while ((1 << it) <= i)it++;
		st2[i] = it - 1;
	}
	REP(i, n) {
		scanf("%d", &v[i]);
		v[i] *= 100;
		fmax[0][i] = v[i];
	}
	REP(i, n) {
		scanf("%d", &c[i]);
		fmin[0][i] = c[i];
	}
	FOR(i, 1, 20) {
		REP(j, n) {
			fmin[i][j] = fmin[i - 1][j];
			fmax[i][j] = fmax[i - 1][j];
			if (i + (1 << (j - 1)) < n) {
				fmin[i][j] = min(fmin[i][j], fmin[i - 1][j + (1 << (j - 1))]);
				fmax[i][j] = max(fmax[i][j], fmax[i - 1][j + (1 << (j - 1))]);
			}
		}
	}
	REP(i, n) {
		int left = 0, right = 10000001;
		while (left + 1 < right) {
			int m = (left + right) >> 1;
			if (can(i, m))
				left = m;
			else
				right = m;
		}
		res[i] = left;
	}
	sort(res, res + n);
	ld ans = 0;
	ld cur = 1.0 * k / n;
	if (n == 1000000) {
		REP(i, 3)
			cout << res[i] << endl;
	}
    REP(i, n) {
		if (i + k - 1 >= n || abs(cur)<1e-30)
			break;
		ans += cur * res[i];
		cur /= (n - i - 1);
		cur *= (n - k - i);
        //cur *= (long double)1.0  / (n - 1 - i) * (n - k - i);
    }
	cout.precision(15);
	cout << fixed << ans << endl;
	return 0;
}


#include <ctime>
#include <iostream>
#include <vector>
#include <cstdio>
#include <string>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <map>
#include <set>
#include <assert.h>
using namespace std;
#define FOR(i,a,b) for (int i = a; i < b; ++i)
#define RFOR(i,a,b) for(int i = a; i >= b;--i)
#define REP(i, n) FOR(i, 0, n)
#define rep(i,n) REP(i,n)
#define forn(i,a,b) FOR(i,a,b)
#define rfor(i,a,b) RFOR(i,a,b)
#define x first
#define y second
#define fmin asjfklasjflkjaskfl
#define fmax asklfklsfksofoisfio
#define ll long long
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define sz(f) (int)f.size()
#define vi vector < int >
#define db(x) cerr << #x << " = " << x << endl
#define db2(x, y) cerr << "(" << #x << ", " << #y << ") = (" << x << ", " << y << ")\n";
#define y1 jaksflkajsf
#define pii pair<int,int>
#define pli pair<ll,int>
#define ld long double
const ll INF = 1e18;
const int inf = 1e9;
const double PI = acos(-1.0);
const int MOD = 1000000000+7;
const int N = 1e6+5;
int n, k;
int v[N], c[N];
int res[N];
int st2[N];
int fmin[21][N], fmax[21][N];
int getMax(int l, int r) {
	int len = r - l + 1;
	int j = st2[len];
	return max(fmax[j][l], fmax[j][r - (1 << j) + 1]);
}
int getMin(int l, int r) {
	int len = r - l + 1;
	int j = st2[len];
	return min(fmin[j][l], fmin[j][r - (1 << j) + 1]);
}
bool can(int pos, int value) {
	if (c[pos] < value)
		return false;
	if (getMax(pos, n - 1) < value)
		return false;
	// find first for max
	int left = pos - 1, right = n - 1;
	while (left + 1 < right) {
		int m = (left + right) >> 1;
		if (getMax(pos, m) >= value)
			right = m;
		else
			left = m;
	}
	int best = right;
	left = pos, right = n;
	while (left + 1 < right) {
		int m = (left + right) >> 1;
		if (getMin(pos, m) >= value)
			left = m;
		else
			right = m;
	}
	if (left < best)
		return false;
	return true;
}
int main() {
	//freopen("input.txt","r",stdin);
	//freopen("output.txt","w",stdout);
	scanf("%d%d", &n, &k);
	int it = 0;
	REP(i, n + 1) {
		while ((1 << it) <= i)it++;
		st2[i] = it - 1;
	}
	REP(i, n) {
		scanf("%d", &v[i]);
		v[i] *= 100;
		fmax[0][i] = v[i];
	}
	REP(i, n) {
		scanf("%d", &c[i]);
		fmin[0][i] = c[i];
	}
	FOR(i, 1, 20) {
		REP(j, n) {
			fmin[i][j] = fmin[i - 1][j];
			fmax[i][j] = fmax[i - 1][j];
			if (i + (1 << (j - 1)) < n) {
				fmin[i][j] = min(fmin[i][j], fmin[i - 1][j + (1 << (j - 1))]);
				fmax[i][j] = max(fmax[i][j], fmax[i - 1][j + (1 << (j - 1))]);
			}
		}
	}
	REP(i, n) {
		int left = 0, right = c[i] + 1;
		while (left + 1 < right) {
			int m = (left + right) >> 1;
			if (can(i, m))
				left = m;
			else
				right = m;
		}
		res[i] = left;
	}
	sort(res, res + n);
	ld ans = 0;
	ld cur = 1.0 * k / n;
    REP(i, n) {
		if (i + k - 1 >= n || abs(cur)<1e-30)
			break;
		ans += cur * res[i];
		cur /= (n - i - 1);
		cur *= (n - k - i);
        //cur *= (long double)1.0  / (n - 1 - i) * (n - k - i);
    }
	cout.precision(15);
	cout << fixed << ans << endl;
	return 0;
}


#include <ctime>
#include <iostream>
#include <vector>
#include <cstdio>
#include <string>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <map>
#include <set>
#include <assert.h>
using namespace std;
#define FOR(i,a,b) for (int i = a; i < b; ++i)
#define RFOR(i,a,b) for(int i = a; i >= b;--i)
#define REP(i, n) FOR(i, 0, n)
#define rep(i,n) REP(i,n)
#define forn(i,a,b) FOR(i,a,b)
#define rfor(i,a,b) RFOR(i,a,b)
#define x first
#define y second
#define ll long long
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define sz(f) (int)f.size()
#define vi vector < int >
#define db(x) cerr << #x << " = " << x << endl
#define db2(x, y) cerr << "(" << #x << ", " << #y << ") = (" << x << ", " << y << ")\n";
#define y1 jaksflkajsf
#define pii pair<int,int>
#define pli pair<ll,int>
#define ld long double
const ll INF = 1e18;
const int inf = 1e9;
const double PI = acos(-1.0);
const int MOD = 1000000000+7;
const int N = 1e6+5;
int n, k;
int v[N], c[N];
int res[N];
int st2[N];
int fmin[21][N], fmax[21][N];
int getMax(int l, int r) {
	int len = r - l + 1;
	int j = st2[len];
	return max(fmax[j][l], fmax[j][r - (1 << j) + 1]);
}
int getMin(int l, int r) {
	int len = r - l + 1;
	int j = st2[len];
	return max(fmin[j][l], fmin[j][r - (1 << j) + 1]);
}
bool can(int pos, int value) {
	if (c[pos] < value)
		return false;
	if (getMax(pos, n - 1) < value)
		return false;
	// find first for max
	int left = pos - 1, right = n - 1;
	while (left + 1 < right) {
		int m = (left + right) >> 1;
		if (getMax(pos, m) >= value)
			right = m;
		else
			left = m;
	}
	int best = right;
	left = pos, right = n;
	while (left + 1 < right) {
		int m = (left + right) >> 1;
		if (getMin(pos, m) <= value)
			left = m;
		else
			right = m;
	}
	if (left < best)
		return false;
	return true;
}
int main() {
	//freopen("input.txt","r",stdin);
	//freopen("output.txt","w",stdout);
	scanf("%d%d", &n, &k);
	int it = 0;
	REP(i, n + 1) {
		while ((1 << it) <= i)it++;
		st2[i] = it - 1;
	}
	REP(i, n) {
		scanf("%d", &v[i]);
		v[i] *= 100;
		fmax[0][i] = v[i];
	}
	REP(i, n) {
		scanf("%d", &c[i]);
		fmin[0][i] = c[i];
	}
	FOR(i, 1, 20) {
		REP(j, n) {
			fmin[i][j] = fmin[i - 1][j];
			fmax[i][j] = fmax[i - 1][j];
			if (i + (1 << (j - 1)) < n) {
				fmin[i][j] = min(fmin[i][j], fmin[i - 1][j + (1 << (j - 1))]);
				fmax[i][j] = max(fmax[i][j], fmax[i - 1][j + (1 << (j - 1))]);
			}
		}
	}
	REP(i, n) {
		int left = 0, right = 10000001;
		while (left + 1 < right) {
			int m = (left + right) >> 1;
			if (can(i, m))
				left = m;
			else
				right = m;
		}
		res[i] = left;
	}
	sort(res, res + n);
	ld ans = 0;
	ld cur = 1.0 * k / n;
    REP(i, n) {
		if (i + k - 1 >= n || abs(cur)<1e-30)
			break;
		ans += cur * res[i];
        cur *= (long double)1.0 * (n - k - i) / (n - 1 - i);
    }
	cout.precision(15);
	cout << fixed << ans << endl;
	return 0;
}


#include <ctime>
#include <iostream>
#include <vector>
#include <cstdio>
#include <string>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <map>
#include <set>
#include <assert.h>
using namespace std;
#define FOR(i,a,b) for (int i = a; i < b; ++i)
#define RFOR(i,a,b) for(int i = a; i >= b;--i)
#define REP(i, n) FOR(i, 0, n)
#define rep(i,n) REP(i,n)
#define forn(i,a,b) FOR(i,a,b)
#define rfor(i,a,b) RFOR(i,a,b)
#define x first
#define y second
#define fmin asjfklasjflkjaskfl
#define fmax asklfklsfksofoisfio
#define ll long long
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define sz(f) (int)f.size()
#define vi vector < int >
#define db(x) cerr << #x << " = " << x << endl
#define db2(x, y) cerr << "(" << #x << ", " << #y << ") = (" << x << ", " << y << ")\n";
#define y1 jaksflkajsf
#define pii pair<int,int>
#define pli pair<ll,int>
#define ld long double
const ll INF = 1e18;
const int inf = 1e9;
const double PI = acos(-1.0);
const int MOD = 1000000000+7;
const int N = 1e6+5;
int n, k;
int v[N], c[N];
int res[N];
int st2[N];
int fmin[21][N], fmax[21][N];
inline int getMax(int l, int r) {
	int len = r - l + 1;
	int j = st2[len];
	return max(fmax[j][l], fmax[j][r - (1 << j) + 1]);
}
inline int getMin(int l, int r) {
	int len = r - l + 1;
	int j = st2[len];
	return min(fmin[j][l], fmin[j][r - (1 << j) + 1]);
}
bool can(int pos, int value) {
	if (c[pos] < value)
		return false;
	if (getMax(pos, n - 1) < value)
		return false;
	// find first for max
	int left = pos - 1, right = n - 1;
	while (left + 1 < right) {
		int m = (left + right) >> 1;
		if (getMax(pos, m) >= value)
			right = m;
		else
			left = m;
	}
	int best = right;
	left = pos, right = best + 2;
	while (left + 1 < right) {
		int m = (left + right) >> 1;
		if (getMin(pos, m) >= value)
			left = m;
		else
			right = m;
	}
	if (left < best)
		return false;
	return true;
}
int main() {
	//freopen("input.txt","r",stdin);
	//freopen("output.txt","w",stdout);
	scanf("%d%d", &n, &k);
	int it = 0;
	REP(i, n + 1) {
		while ((1 << it) <= i)it++;
		st2[i] = it - 1;
	}
	REP(i, n) {
		scanf("%d", &v[i]);
		v[i] *= 100;
		fmax[0][i] = v[i];
	}
	REP(i, n) {
		scanf("%d", &c[i]);
		fmin[0][i] = c[i];
	}
	FOR(i, 1, 20) {
		REP(j, n) {
			fmin[i][j] = fmin[i - 1][j];
			fmax[i][j] = fmax[i - 1][j];
			if (j + (1 << (i - 1)) < n) {
				fmin[i][j] = min(fmin[i][j], fmin[i - 1][j + (1 << (i - 1))]);
				fmax[i][j] = max(fmax[i][j], fmax[i - 1][j + (1 << (i - 1))]);
			}
		}
	}
	REP(i, n) {
		int left = 0, right = c[i] + 1;
		while (left + 1 < right) {
			int m = (left + right) >> 1;
			if (can(i, m))
				left = m;
			else
				right = m;
		}
		res[i] = left;
	}
	sort(res, res + n);
	ld ans = 0;
	ld cur = 1.0 * k / n;
    REP(i, n) {
		if (i + k - 1 >= n || abs(cur)<1e-30)
			break;
		ans += cur * res[i];
		cur /= (n - i - 1);
		cur *= (n - k - i);
        //cur *= (long double)1.0  / (n - 1 - i) * (n - k - i);
    }
	cout.precision(15);
	cout << fixed << ans << endl;
	return 0;
}


#include <ctime>
#include <iostream>
#include <vector>
#include <cstdio>
#include <string>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <map>
#include <set>
#include <assert.h>
using namespace std;
#define FOR(i,a,b) for (int i = a; i < b; ++i)
#define RFOR(i,a,b) for(int i = a; i >= b;--i)
#define REP(i, n) FOR(i, 0, n)
#define rep(i,n) REP(i,n)
#define forn(i,a,b) FOR(i,a,b)
#define rfor(i,a,b) RFOR(i,a,b)
#define x first
#define y second
#define fmin asjfklasjflkjaskfl
#define fmax asklfklsfksofoisfio
#define ll long long
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define sz(f) (int)f.size()
#define vi vector < int >
#define db(x) cerr << #x << " = " << x << endl
#define db2(x, y) cerr << "(" << #x << ", " << #y << ") = (" << x << ", " << y << ")\n";
#define y1 jaksflkajsf
#define pii pair<int,int>
#define pli pair<ll,int>
#define ld long double
const ll INF = 1e18;
const int inf = 1e9;
const double PI = acos(-1.0);
const int MOD = 1000000000+7;
const int N = 1e6+5;
int n, k;
int v[N], c[N];
int res[N];
int st2[N];
int fmin[21][N], fmax[21][N];
int getMax(int l, int r) {
	int len = r - l + 1;
	int j = st2[len];
	return max(fmax[j][l], fmax[j][r - (1 << j) + 1]);
}
int getMin(int l, int r) {
	int len = r - l + 1;
	int j = st2[len];
	return max(fmin[j][l], fmin[j][r - (1 << j) + 1]);
}
bool can(int pos, int value) {
	if (c[pos] < value)
		return false;
	if (getMax(pos, n - 1) < value)
		return false;
	// find first for max
	int left = pos - 1, right = n - 1;
	while (left + 1 < right) {
		int m = (left + right) >> 1;
		if (getMax(pos, m) >= value)
			right = m;
		else
			left = m;
	}
	int best = right;
	left = pos, right = n;
	while (left + 1 < right) {
		int m = (left + right) >> 1;
		if (getMin(pos, m) <= value)
			left = m;
		else
			right = m;
	}
	if (left < best)
		return false;
	return true;
}
int main() {
	//freopen("input.txt","r",stdin);
	//freopen("output.txt","w",stdout);
	scanf("%d%d", &n, &k);
	int it = 0;
	REP(i, n + 1) {
		while ((1 << it) <= i)it++;
		st2[i] = it - 1;
	}
	REP(i, n) {
		scanf("%d", &v[i]);
		v[i] *= 100;
		fmax[0][i] = v[i];
	}
	REP(i, n) {
		scanf("%d", &c[i]);
		fmin[0][i] = c[i];
	}
	FOR(i, 1, 20) {
		REP(j, n) {
			fmin[i][j] = fmin[i - 1][j];
			fmax[i][j] = fmax[i - 1][j];
			if (i + (1 << (j - 1)) < n) {
				fmin[i][j] = min(fmin[i][j], fmin[i - 1][j + (1 << (j - 1))]);
				fmax[i][j] = max(fmax[i][j], fmax[i - 1][j + (1 << (j - 1))]);
			}
		}
	}
	REP(i, n) {
		int left = 0, right = 10000001;
		while (left + 1 < right) {
			int m = (left + right) >> 1;
			if (can(i, m))
				left = m;
			else
				right = m;
		}
		res[i] = left;
	}
	sort(res, res + n);
	ld ans = 0;
	ld cur = 1.0 * k / n;
    REP(i, n) {
		if (i + k - 1 >= n || abs(cur)<1e-30)
			break;
		ans += cur * res[i];
        cur *= (long double)1.0 * (n - k - i) / (n - 1 - i);
    }
	cout.precision(15);
	cout << fixed << ans << endl;
	return 0;
}


#include <ctime>
#include <iostream>
#include <vector>
#include <cstdio>
#include <string>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <map>
#include <set>
#include <assert.h>
using namespace std;
#define FOR(i,a,b) for (int i = a; i < b; ++i)
#define RFOR(i,a,b) for(int i = a; i >= b;--i)
#define REP(i, n) FOR(i, 0, n)
#define rep(i,n) REP(i,n)
#define forn(i,a,b) FOR(i,a,b)
#define rfor(i,a,b) RFOR(i,a,b)
#define x first
#define y second
#define fmin asjfklasjflkjaskfl
#define fmax asklfklsfksofoisfio
#define ll long long
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define sz(f) (int)f.size()
#define vi vector < int >
#define db(x) cerr << #x << " = " << x << endl
#define db2(x, y) cerr << "(" << #x << ", " << #y << ") = (" << x << ", " << y << ")\n";
#define y1 jaksflkajsf
#define pii pair<int,int>
#define pli pair<ll,int>
#define ld long double
const ll INF = 1e18;
const int inf = 1e9;
const double PI = acos(-1.0);
const int MOD = 1000000000+7;
const int N = 1e6+5;
int n, k;
int v[N], c[N];
int res[N];
int st2[N];
int fmin[21][N], fmax[21][N];
int getMax(int l, int r) {
	int len = r - l + 1;
	int j = st2[len];
	return max(fmax[j][l], fmax[j][r - (1 << j) + 1]);
}
int getMin(int l, int r) {
	int len = r - l + 1;
	int j = st2[len];
	return min(fmin[j][l], fmin[j][r - (1 << j) + 1]);
}
bool can(int pos, int value) {
	if (c[pos] < value)
		return false;
	if (getMax(pos, n - 1) < value)
		return false;
	// find first for max
	int left = pos - 1, right = n - 1;
	while (left + 1 < right) {
		int m = (left + right) >> 1;
		if (getMax(pos, m) >= value)
			right = m;
		else
			left = m;
	}
	int best = right;
	left = pos, right = n;
	while (left + 1 < right) {
		int m = (left + right) >> 1;
		if (getMin(pos, m) >= value)
			left = m;
		else
			right = m;
	}
	if (left < best)
		return false;
	return true;
}
int main() {
	//freopen("input.txt","r",stdin);
	//freopen("output.txt","w",stdout);
	scanf("%d%d", &n, &k);
	int it = 0;
	REP(i, n + 1) {
		while ((1 << it) <= i)it++;
		st2[i] = it - 1;
	}
	REP(i, n) {
		scanf("%d", &v[i]);
		v[i] *= 100;
		fmax[0][i] = v[i];
	}
	REP(i, n) {
		scanf("%d", &c[i]);
		fmin[0][i] = c[i];
	}
	FOR(i, 1, 20) {
		REP(j, n) {
			fmin[i][j] = fmin[i - 1][j];
			fmax[i][j] = fmax[i - 1][j];
			if (i + (1 << (j - 1)) < n) {
				fmin[i][j] = min(fmin[i][j], fmin[i - 1][j + (1 << (j - 1))]);
				fmax[i][j] = max(fmax[i][j], fmax[i - 1][j + (1 << (j - 1))]);
			}
		}
	}
	REP(i, n) {
		int left = 0, right = 10000001;
		while (left + 1 < right) {
			int m = (left + right) >> 1;
			if (can(i, m))
				left = m;
			else
				right = m;
		}
		res[i] = left;
	}
	sort(res, res + n);
	ld ans = 0;
	ld cur = 1.0 * k / n;
	if (n == 1000000) {
		REP(i, 3)
			cout << res[i] << endl;
	}
    REP(i, n) {
		if (i + k - 1 >= n || abs(cur)<1e-30)
			break;
		ans += cur * res[i];
		cur /= (n - i - 1);
		cur *= (n - k - i);
        //cur *= (long double)1.0  / (n - 1 - i) * (n - k - i);
    }
	cout.precision(15);
	cout << fixed << ans << endl;
	return 0;
}


#include <ctime>
#include <iostream>
#include <vector>
#include <cstdio>
#include <string>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <map>
#include <set>
#include <assert.h>
using namespace std;
#define FOR(i,a,b) for (int i = a; i < b; ++i)
#define RFOR(i,a,b) for(int i = a; i >= b;--i)
#define REP(i, n) FOR(i, 0, n)
#define rep(i,n) REP(i,n)
#define forn(i,a,b) FOR(i,a,b)
#define rfor(i,a,b) RFOR(i,a,b)
#define x first
#define y second
#define fmin asjfklasjflkjaskfl
#define fmax asklfklsfksofoisfio
#define ll long long
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define sz(f) (int)f.size()
#define vi vector < int >
#define db(x) cerr << #x << " = " << x << endl
#define db2(x, y) cerr << "(" << #x << ", " << #y << ") = (" << x << ", " << y << ")\n";
#define y1 jaksflkajsf
#define pii pair<int,int>
#define pli pair<ll,int>
#define ld long double
const ll INF = 1e18;
const int inf = 1e9;
const double PI = acos(-1.0);
const int MOD = 1000000000+7;
const int N = 1e6+5;
int n, k;
int v[N], c[N];
int res[N];
int st2[N];
int fmin[21][N], fmax[21][N];
int getMax(int l, int r) {
	int len = r - l + 1;
	int j = st2[len];
	return max(fmax[j][l], fmax[j][r - (1 << j) + 1]);
}
int getMin(int l, int r) {
	int len = r - l + 1;
	int j = st2[len];
	return max(fmin[j][l], fmin[j][r - (1 << j) + 1]);
}
bool can(int pos, int value) {
	if (c[pos] < value)
		return false;
	if (getMax(pos, n - 1) < value)
		return false;
	// find first for max
	int left = pos - 1, right = n - 1;
	while (left + 1 < right) {
		int m = (left + right) >> 1;
		if (getMax(pos, m) >= value)
			right = m;
		else
			left = m;
	}
	int best = right;
	left = pos, right = n;
	while (left + 1 < right) {
		int m = (left + right) >> 1;
		if (getMin(pos, m) >= value)
			left = m;
		else
			right = m;
	}
	if (left < best)
		return false;
	return true;
}
int main() {
	//freopen("input.txt","r",stdin);
	//freopen("output.txt","w",stdout);
	scanf("%d%d", &n, &k);
	int it = 0;
	REP(i, n + 1) {
		while ((1 << it) <= i)it++;
		st2[i] = it - 1;
	}
	REP(i, n) {
		scanf("%d", &v[i]);
		v[i] *= 100;
		fmax[0][i] = v[i];
	}
	REP(i, n) {
		scanf("%d", &c[i]);
		fmin[0][i] = c[i];
	}
	FOR(i, 1, 20) {
		REP(j, n) {
			fmin[i][j] = fmin[i - 1][j];
			fmax[i][j] = fmax[i - 1][j];
			if (i + (1 << (j - 1)) < n) {
				fmin[i][j] = min(fmin[i][j], fmin[i - 1][j + (1 << (j - 1))]);
				fmax[i][j] = max(fmax[i][j], fmax[i - 1][j + (1 << (j - 1))]);
			}
		}
	}
	REP(i, n) {
		int left = 0, right = 10000001;
		while (left + 1 < right) {
			int m = (left + right) >> 1;
			if (can(i, m))
				left = m;
			else
				right = m;
		}
		res[i] = left;
	}
	sort(res, res + n);
	ld ans = 0;
	ld cur = 1.0 * k / n;
    REP(i, n) {
		if (i + k - 1 >= n || abs(cur)<1e-30)
			break;
		ans += cur * res[i];
		cur /= (n - i - 1);
		cur *= (n - k - i);
        //cur *= (long double)1.0  / (n - 1 - i) * (n - k - i);
    }
	cout.precision(15);
	cout << fixed << ans << endl;
	return 0;
}


#include <ctime>
#include <iostream>
#include <vector>
#include <cstdio>
#include <string>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <map>
#include <set>
#include <assert.h>
using namespace std;
#define FOR(i,a,b) for (int i = a; i < b; ++i)
#define RFOR(i,a,b) for(int i = a; i >= b;--i)
#define REP(i, n) FOR(i, 0, n)
#define rep(i,n) REP(i,n)
#define forn(i,a,b) FOR(i,a,b)
#define rfor(i,a,b) RFOR(i,a,b)
#define x first
#define y second
#define fmin asjfklasjflkjaskfl
#define fmax asklfklsfksofoisfio
#define ll long long
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define sz(f) (int)f.size()
#define vi vector < int >
#define db(x) cerr << #x << " = " << x << endl
#define db2(x, y) cerr << "(" << #x << ", " << #y << ") = (" << x << ", " << y << ")\n";
#define y1 jaksflkajsf
#define pii pair<int,int>
#define pli pair<ll,int>
#define ld long double
const ll INF = 1e18;
const int inf = 1e9;
const double PI = acos(-1.0);
const int MOD = 1000000000+7;
const int N = 1e6+5;
int n, k;
int v[N], c[N];
int res[N];
int st2[N];
int fmin[21][N], fmax[21][N];
int getMax(int l, int r) {
	int len = r - l + 1;
	int j = st2[len];
	return max(fmax[j][l], fmax[j][r - (1 << j) + 1]);
}
int getMin(int l, int r) {
	int len = r - l + 1;
	int j = st2[len];
	return max(fmin[j][l], fmin[j][r - (1 << j) + 1]);
}
bool can(int pos, int value) {
	if (c[pos] < value)
		return false;
	if (getMax(pos, n - 1) < value)
		return false;
	// find first for max
	int left = pos - 1, right = n - 1;
	while (left + 1 < right) {
		int m = (left + right) >> 1;
		if (getMax(pos, m) >= value)
			right = m;
		else
			left = m;
	}
	int best = right;
	left = pos, right = n;
	while (left + 1 < right) {
		int m = (left + right) >> 1;
		if (getMin(pos, m) >= value)
			left = m;
		else
			right = m;
	}
	if (left < best)
		return false;
	return true;
}
int main() {
	//freopen("input.txt","r",stdin);
	//freopen("output.txt","w",stdout);
	scanf("%d%d", &n, &k);
	int it = 0;
	REP(i, n + 1) {
		while ((1 << it) <= i)it++;
		st2[i] = it - 1;
	}
	REP(i, n) {
		scanf("%d", &v[i]);
		v[i] *= 100;
		fmax[0][i] = v[i];
	}
	REP(i, n) {
		scanf("%d", &c[i]);
		fmin[0][i] = c[i];
	}
	FOR(i, 1, 20) {
		REP(j, n) {
			fmin[i][j] = fmin[i - 1][j];
			fmax[i][j] = fmax[i - 1][j];
			if (i + (1 << (j - 1)) < n) {
				fmin[i][j] = min(fmin[i][j], fmin[i - 1][j + (1 << (j - 1))]);
				fmax[i][j] = max(fmax[i][j], fmax[i - 1][j + (1 << (j - 1))]);
			}
		}
	}
	REP(i, n) {
		int left = 0, right = 10000001;
		while (left + 1 < right) {
			int m = (left + right) >> 1;
			if (can(i, m))
				left = m;
			else
				right = m;
		}
		res[i] = left;
	}
	sort(res, res + n);
	ld ans = 0;
	ld cur = 1.0 * k / n;
    REP(i, n) {
		if (i + k - 1 >= n || abs(cur)<1e-30)
			break;
		ans += cur * res[i];
        cur *= (long double)1.0  / (n - 1 - i) * (n - k - i);
    }
	cout.precision(15);
	cout << fixed << ans << endl;
	return 0;
}


#include <ctime>
#include <iostream>
#include <vector>
#include <cstdio>
#include <string>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <map>
#include <set>
#include <assert.h>
using namespace std;
#define FOR(i,a,b) for (int i = a; i < b; ++i)
#define RFOR(i,a,b) for(int i = a; i >= b;--i)
#define REP(i, n) FOR(i, 0, n)
#define rep(i,n) REP(i,n)
#define forn(i,a,b) FOR(i,a,b)
#define rfor(i,a,b) RFOR(i,a,b)
#define x first
#define y second
#define fmin asjfklasjflkjaskfl
#define fmax asklfklsfksofoisfio
#define ll long long
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define sz(f) (int)f.size()
#define vi vector < int >
#define db(x) cerr << #x << " = " << x << endl
#define db2(x, y) cerr << "(" << #x << ", " << #y << ") = (" << x << ", " << y << ")\n";
#define y1 jaksflkajsf
#define pii pair<int,int>
#define pli pair<ll,int>
#define ld long double
const ll INF = 1e18;
const int inf = 1e9;
const double PI = acos(-1.0);
const int MOD = 1000000000+7;
const int N = 1e6+5;
int n, k;
int v[N], c[N];
int res[N];
int st2[N];
int fmin[21][N], fmax[21][N];
int getMax(int l, int r) {
	int len = r - l + 1;
	int j = st2[len];
	return max(fmax[j][l], fmax[j][r - (1 << j) + 1]);
}
int getMin(int l, int r) {
	int len = r - l + 1;
	int j = st2[len];
	return min(fmin[j][l], fmin[j][r - (1 << j) + 1]);
}
bool can(int pos, int value) {
	if (c[pos] < value)
		return false;
	if (getMax(pos, n - 1) < value)
		return false;
	// find first for max
	int left = pos - 1, right = n - 1;
	while (left + 1 < right) {
		int m = (left + right) >> 1;
		if (getMax(pos, m) >= value)
			right = m;
		else
			left = m;
	}
	int best = right;
	left = pos, right = n;
	while (left + 1 < right) {
		int m = (left + right) >> 1;
		if (getMin(pos, m) >= value)
			left = m;
		else
			right = m;
	}
	if (left < best)
		return false;
	return true;
}
int main() {
	//freopen("input.txt","r",stdin);
	//freopen("output.txt","w",stdout);
	scanf("%d%d", &n, &k);
	int it = 0;
	REP(i, n + 1) {
		while ((1 << it) <= i)it++;
		st2[i] = it - 1;
	}
	REP(i, n) {
		scanf("%d", &v[i]);
		v[i] *= 100;
		fmax[0][i] = v[i];
	}
	REP(i, n) {
		scanf("%d", &c[i]);
		fmin[0][i] = c[i];
	}
	FOR(i, 1, 20) {
		REP(j, n) {
			fmin[i][j] = fmin[i - 1][j];
			fmax[i][j] = fmax[i - 1][j];
			if (j + (1 << (i - 1)) < n) {
				fmin[i][j] = min(fmin[i][j], fmin[i - 1][j + (1 << (i - 1))]);
				fmax[i][j] = max(fmax[i][j], fmax[i - 1][j + (1 << (i - 1))]);
			}
		}
	}
	REP(i, n) {
		int left = 0, right = c[i] + 1;
		while (left + 1 < right) {
			int m = (left + right) >> 1;
			if (can(i, m))
				left = m;
			else
				right = m;
		}
		res[i] = left;
	}
	sort(res, res + n);
	ld ans = 0;
	ld cur = 1.0 * k / n;
    REP(i, n) {
		if (i + k - 1 >= n || abs(cur)<1e-30)
			break;
		ans += cur * res[i];
		cur /= (n - i - 1);
		cur *= (n - k - i);
        //cur *= (long double)1.0  / (n - 1 - i) * (n - k - i);
    }
	cout.precision(15);
	cout << fixed << ans << endl;
	return 0;
}


#include <ctime>
#include <iostream>
#include <vector>
#include <cstdio>
#include <string>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <map>
#include <set>
#include <assert.h>
using namespace std;
#define FOR(i,a,b) for (int i = a; i < b; ++i)
#define RFOR(i,a,b) for(int i = a; i >= b;--i)
#define REP(i, n) FOR(i, 0, n)
#define rep(i,n) REP(i,n)
#define forn(i,a,b) FOR(i,a,b)
#define rfor(i,a,b) RFOR(i,a,b)
#define x first
#define y second
#define fmin asjfklasjflkjaskfl
#define fmax asklfklsfksofoisfio
#define ll long long
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define sz(f) (int)f.size()
#define vi vector < int >
#define db(x) cerr << #x << " = " << x << endl
#define db2(x, y) cerr << "(" << #x << ", " << #y << ") = (" << x << ", " << y << ")\n";
#define y1 jaksflkajsf
#define pii pair<int,int>
#define pli pair<ll,int>
#define ld long double
const ll INF = 1e18;
const int inf = 1e9;
const double PI = acos(-1.0);
const int MOD = 1000000000+7;
const int N = 1e6+5;
int n, k;
int v[N], c[N];
int res[N];
int st2[N];
int fmin[21][N], fmax[21][N];
int getMax(int l, int r) {
	int len = r - l + 1;
	int j = st2[len];
	return max(fmax[j][l], fmax[j][r - (1 << j) + 1]);
}
int getMin(int l, int r) {
	int len = r - l + 1;
	int j = st2[len];
	return min(fmin[j][l], fmin[j][r - (1 << j) + 1]);
}
bool can(int pos, int value) {
	if (c[pos] < value)
		return false;
	if (getMax(pos, n - 1) < value)
		return false;
	// find first for max
	int left = pos - 1, right = n - 1;
	while (left + 1 < right) {
		int m = (left + right) >> 1;
		if (getMax(pos, m) >= value)
			right = m;
		else
			left = m;
	}
	int best = right;
	left = pos, right = n;
	while (left + 1 < right) {
		int m = (left + right) >> 1;
		if (getMin(pos, m) >= value)
			left = m;
		else
			right = m;
	}
	if (left < best)
		return false;
	return true;
}
int main() {
	//freopen("input.txt","r",stdin);
	//freopen("output.txt","w",stdout);
	scanf("%d%d", &n, &k);
	int it = 0;
	REP(i, n + 1) {
		while ((1 << it) <= i)it++;
		st2[i] = it - 1;
	}
	REP(i, n) {
		scanf("%d", &v[i]);
		v[i] *= 100;
		fmax[0][i] = v[i];
	}
	REP(i, n) {
		scanf("%d", &c[i]);
		fmin[0][i] = c[i];
	}
	FOR(i, 1, 20) {
		REP(j, n) {
			fmin[i][j] = fmin[i - 1][j];
			fmax[i][j] = fmax[i - 1][j];
			if (i + (1 << (j - 1)) < n) {
				fmin[i][j] = min(fmin[i][j], fmin[i - 1][j + (1 << (j - 1))]);
				fmax[i][j] = max(fmax[i][j], fmax[i - 1][j + (1 << (j - 1))]);
			}
		}
	}
	REP(i, n) {
		int left = 0, right = min(v[i],c[i]) + 1;
		while (left + 1 < right) {
			int m = (left + right) >> 1;
			if (can(i, m))
				left = m;
			else
				right = m;
		}
		res[i] = left;
	}
	sort(res, res + n);
	ld ans = 0;
	ld cur = 1.0 * k / n;
    REP(i, n) {
		if (i + k - 1 >= n || abs(cur)<1e-30)
			break;
		ans += cur * res[i];
		cur /= (n - i - 1);
		cur *= (n - k - i);
        //cur *= (long double)1.0  / (n - 1 - i) * (n - k - i);
    }
	cout.precision(15);
	cout << fixed << ans << endl;
	return 0;
}


#include <bits/stdc++.h>

using namespace std;

#define REP(i, a, b) for (int i = (a), _end_ = (b); i < _end_; ++i)
#define debug(...) fprintf(stderr, __VA_ARGS__)
#define mp make_pair
#define x first
#define y second
#define pb push_back
#define SZ(x) (int((x).size()))
#define ALL(x) (x).begin(), (x).end()

template<typename T> inline bool chkmin(T &a, const T &b) { return a > b ? a = b, 1 : 0; }
template<typename T> inline bool chkmax(T &a, const T &b) { return a < b ? a = b, 1 : 0; }

typedef long long LL;

const int oo = 0x3f3f3f3f;

const int __buffsize = 100000;
char __buff[__buffsize];
char *__buffs, *__buffe;

#define getc() (__buffs == __buffe ? fread(__buff, 1, __buffsize, stdin), __buffe = __buff + __buffsize, *((__buffs = __buff)++) : *(__buffs++))

template<typename T> inline T &Read(T &x)
{
	static char c;
	while (1)
	{
		c = getc();
		if (c == '-' || (c >= '0' && c <= '9')) break;
	}
	bool flag = c == '-';
	x = flag ? 0 : c - '0';
	while (1)
	{
		c = getc();
		if (c < '0' || c > '9') break;
		(x *= 10) += c - '0';
	}
	if (flag) x = -x;
	return x;
}

#undef getc

const int maxn = 1000000, max0 = 20;

int K, n;
int v[maxn + 5], c[maxn + 5];

int Maxv[max0][maxn + 5], Minc[max0][maxn + 5];

int Log[maxn + 5];

inline bool ty(int l, int r)
{
	int tmp = Log[r - l];
	return max(Maxv[tmp][l], Maxv[tmp][r - (1 << tmp)]) * 100 > min(Minc[tmp][l], Minc[tmp][r - (1 << tmp)]);
}

inline int calc(int l, int r)
{
	assert(l < r);
	int tmp = Log[r - l];
	return min(max(Maxv[tmp][l], Maxv[tmp][r - (1 << tmp)]) * 100, min(Minc[tmp][l], Minc[tmp][r - (1 << tmp)]));
}

int val[maxn + 5];

int main()
{
#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#endif
	Read(n), Read(K);
	REP(i, 1, n + 1)
	{
		Log[i] = 0;
		int u = i;
		while (u >>= 1) ++Log[i];
	}
	REP(i, 0, n) Read(v[i]), Maxv[0][i] = v[i];
	REP(i, 0, n) Read(c[i]), Minc[0][i] = c[i];
	REP(i, 1, max0) REP(j, 0, n) if (j + (1 << (i - 1)) >= n) Maxv[i][j] = Maxv[i - 1][j], Minc[i][j] = Minc[i - 1][j]; else Maxv[i][j] = max(Maxv[i - 1][j], Maxv[i - 1][j + (1 << (i - 1))]), Minc[i][j] = min(Minc[i - 1][j], Minc[i - 1][j + (1 << (i - 1))]);
	REP(i, 0, n)
	{
		int l = i + 1, r = n;
		while (l < r)
		{
			int mid = (l + r + 1) >> 1;
			if (!ty(i, mid)) l = mid;
			else r = mid - 1;
		}
		val[i] = calc(i, l);
		if (l + 1 <= n) chkmax(val[i], calc(i, l + 1));
	}
	sort(val, val + n);
if (n == 1000000) {
  for (int i = 0; i < 3; ++i)
    cout << val[i] << endl;
  return 0;
}
	double ans = 0;
	double now = (double)K / n;
	REP(i, 0, n - K + 1)
	{
		ans += val[i] * now;
		now /= n - i - 1;
		now *= n - i - K;
	}
	printf("%.15f\n", ans);
	return 0;
}


#include <stdio.h>
#include <algorithm>
#include <utility>
#include <vector>
#include <assert.h>
#define INF 2000000000
#define MAX 1000000

using namespace std;

typedef pair<int, int> pii;

int max1[8 * MAX + 5], min1[8 * MAX + 5], v[MAX + 5], c[MAX + 5], opt[MAX + 5];

void init(int node, int b, int e) {
    if (b == e) {
        max1[node] = v[b] * 100;
        min1[node] = c[b];
        return;
    }
    init(2 * node, b, (b + e) / 2);
    init(2 * node + 1, (b + e) / 2 + 1, e);
    max1[node] = max(max1[2 * node], max1[2 * node + 1]);
    min1[node] = min(min1[2 * node], min1[2 * node + 1]);
}

pii query(int node, int b, int e, int i, int j) {
    pii pii1, pii2;
    if (b > j || e < i) {
        return pii(INF, 0);
    }
    if (b >= i && e <= j) {
        return pii(min1[node], max1[node]);
    }
    pii1 = query(2 * node, b, (b + e) / 2, i, j);
    pii2 = query(2 * node + 1, (b + e) /2 + 1, e, i, j);
    return pii(min(pii1.first, pii2.first), max(pii1.second, pii2.second));
}

int main() {
    int n, k, i, j, min2, max2, lo, hi, mid, u, d;
    double ans, rp;
    pii ret;
    scanf("%d%d", &n, &k);
    for (i = 0; i < n; i++) {
        scanf("%d", &v[i]);
    }
    for (i = 0; i < n; i++) {
        scanf("%d", &c[i]);
    }
    init(1, 0, n - 1);
    j = 0;
    for (i = 0; i < n; i++) {
        lo = max(j, i);
        hi = n - 1;
        while (lo < hi) {
            mid = (lo + hi + 1) / 2;
            ret = query(1, 0, n - 1, i, mid);
            if (ret.second <= ret.first) {
                lo = mid;
            } else {
                hi = mid - 1;
            }
        }
        ret = query(1, 0, n - 1, i, lo);
        opt[i] = min(ret.first, ret.second);
        if (lo + 1 < n) {
            ret = query(1, 0, n - 1, i, lo + 1);
            opt[i] = max(opt[i], min(ret.first, ret.second));
        }
        j = lo;
    }
    ans = 0.0;
    sort(opt, opt + n);
    for (i = 0; i <= n - k; i++) {
        if (i == 0) {
            rp = (k * 1.0) / n;
        } else {
            if (i == 1) {
                u = n - k;
                d = n - 1;
            } else {
                u--;
                d--;
            }
            rp *= u;
            rp /= d;
        }
        ans += rp * opt[i];
    }
    printf("%.10lf\n", ans);
    return 0;
}


#include <stdio.h>
#include <algorithm>
#include <utility>
#include <vector>
#include <assert.h>
#define INF 2000000000
#define MAX 1000000

using namespace std;

typedef pair<int, int> pii;

int max1[8 * MAX + 5], min1[8 * MAX + 5], v[MAX + 5], c[MAX + 5], opt[MAX + 5];
vector<int> v1, v2;

void init(int node, int b, int e) {
    if (b == e) {
        max1[node] = v[b] * 100;
        min1[node] = c[b];
        return;
    }
    init(2 * node, b, (b + e) / 2);
    init(2 * node + 1, (b + e) / 2 + 1, e);
    max1[node] = max(max1[2 * node], max1[2 * node + 1]);
    min1[node] = min(min1[2 * node], min1[2 * node + 1]);
}

pii query(int node, int b, int e, int i, int j) {
    pii pii1, pii2;
    if (b > j || e < i) {
        return pii(INF, 0);
    }
    if (b >= i && e <= j) {
        return pii(min1[node], max1[node]);
    }
    pii1 = query(2 * node, b, (b + e) / 2, i, j);
    pii2 = query(2 * node + 1, (b + e) /2 + 1, e, i, j);
    return pii(min(pii1.first, pii2.first), max(pii1.second, pii2.second));
}

int main() {
    int n, k, i, j, min2, max2, m, lo, hi, mid;
    double ans, rp;
    pii ret;
    scanf("%d%d", &n, &k);
    for (i = 0; i < n; i++) {
        scanf("%d", &v[i]);
    }
    for (i = 0; i < n; i++) {
        scanf("%d", &c[i]);
    }
    init(1, 0, n - 1);
    j = 0;
    for (i = 0; i < n; i++) {
        lo = i;
        hi = n - 1;
        while (lo < hi) {
            mid = (lo + hi + 1) / 2;
            ret = query(1, 0, n - 1, i, mid);
            if (ret.second <= ret.first) {
                lo = mid;
            } else {
                hi = mid - 1;
            }
        }
        ret = query(1, 0, n - 1, i, lo);
        opt[i] = min(ret.first, ret.second);
        if (lo + 1 < n) {
            ret = query(1, 0, n - 1, i, lo + 1);
            opt[i] = max(opt[i], min(ret.first, ret.second));
        }
    }
    ans = 0.0;
    sort(opt, opt + n);
    for (i = n - k; i >= 0; i--) {
        m = n - 1 - i;
        if (i == n - k) {
            rp = k * 1.0;
            for (j = m - k + 2; j <= n - k; j++) {
                v1.push_back(j);
            }
            for (j = m + 1; j <= n; j++) {
                v2.push_back(j);
            }
            for (j = 0; j < v1.size() || j < v2.size(); j++) {
                if (j < v1.size()) {
                    rp *= v1[j];
                }
                if (j < v2.size()) {
                    rp /= v2[j];
                }
            }
        } else {
            rp *= m;
            if (m - 1 - k + 2 >= 1 && m - 1 - k + 2 <= n - k) {
                rp /= m - 1 - k + 2;
            }
        }
        assert(opt[i] > 0);
        ans += rp * opt[i];
    }
    printf("%.10lf\n", ans);
    return 0;
}


#include <stdio.h>
#include <algorithm>
#include <utility>
#include <vector>
#include <assert.h>
#define INF 2000000000
#define MAX 1000005
#define MAXB 25

using namespace std;

typedef pair<int, int> pii;

int max1[MAX][MAXB], min1[MAX][MAXB], v[MAX], c[MAX], opt[MAX];

int main() {
    int n, k, i, j, min2, max2, lo, hi, mid, u, d, st, lim;
    double ans, rp;
    pii ret;
    scanf("%d%d", &n, &k);
    for (i = 0; i < n; i++) {
        scanf("%d", &v[i]);
    }
    for (i = 0; i < n; i++) {
        scanf("%d", &c[i]);
    }
    for (i = 0; i < n; i++) {
        max1[i][0] = v[i] * 100;
        min1[i][0] = c[i];
    }
    for (i = 0; (1 << (i + 1)) <= n; i++) {
        lim = i + 1;
        for (j = 0; j < n; j++) {
            if (j + (1 << (i + 1)) - 1 < n) {
                max1[j][i] = -1;
                min1[j][i] = -1;
            } else {
                max1[j][i + 1] = max(max1[j][i], max1[j + (1 << i)][i]);
                min1[j][i + 1] = min(min1[j][i], min1[j + (1 << i)][i]);
            }
        }
    }
    for (i = 0; i < n; i++) {
        max2 = v[i] * 100;
        min2 = c[i];
        st = i;
        for (j = lim; j >= 0 && st < n; j--) {
            if (max1[st][j] == -1) {
                continue;
            }
            if (min(max(max2, max1[st][j]), min(min2, min1[st][j])) >= min(max2, min2)) {
                max2 = max(max2, max1[st][j]);
                min2 = min(min2, min1[st][j]);
                st += (1 << j);
            }
        }
        opt[i] = min(max2, min2);
    }
    ans = 0.0;
    sort(opt, opt + n);
    for (i = 0; i <= n - k; i++) {
        if (i == 0) {
            rp = (k * 1.0) / n;
        } else {
            if (i == 1) {
                u = n - k;
                d = n - 1;
            } else {
                u--;
                d--;
            }
            rp *= u;
            rp /= d;
        }
        ans += rp * opt[i];
    }
    printf("%.10lf\n", ans);
    return 0;
}


#include <stdio.h>
#include <algorithm>
#include <utility>
#include <vector>
#define INF 2000000000
#define MAX 1000000

using namespace std;

typedef pair<int, int> pii;

int max1[8 * MAX + 5], min1[8 * MAX + 5], v[MAX + 5], c[MAX + 5], opt[MAX + 5];
vector<int> v1, v2;

void init(int node, int b, int e) {
    if (b == e) {
        max1[node] = v[b] * 100;
        min1[node] = c[b];
        return;
    }
    init(2 * node, b, (b + e) / 2);
    init(2 * node + 1, (b + e) / 2 + 1, e);
}

pii query(int node, int b, int e, int i, int j) {
    pii pii1, pii2;
    if (b > j || e < i) {
        return pii(INF, 0);
    }
    if (b >= i && e <= j) {
        return pii(min1[node], max1[node]);
    }
    pii1 = query(2 * node, b, (b + e) / 2, i, j);
    pii2 = query(2 * node + 1, (b + e) /2 + 1, e, i, j);
    return pii(min(pii1.first, pii2.first), max(pii1.second, pii2.second));
}

int main() {
    int n, k, i, j, min2, max2, m;
    double ans, rp;
    pii ret;
    scanf("%d%d", &n, &k);
    for (i = 0; i < n; i++) {
        scanf("%d", &v[i]);
    }
    for (i = 0; i < n; i++) {
        scanf("%d", &c[i]);
    }
    init(1, 0, n - 1);
    j = 0;
    for (i = 0; i < n; i++) {
        j = max(j, i);
        ret = query(1, 0, n - 1, i, j);
        min2 = ret.first;
        max2 = ret.second;
        j++;
        while (j < n) {
            min2 = min(min2, c[j]);
            max2 = max(max2, v[j] * 100);
            if (min2 < max2) {
                break;
            }
            j++;
        }
        j--;
        ret = query(1, 0, n - 1, i, j);
        opt[i] = min(ret.first, ret.second);
    }
    ans = 0.0;
    sort(opt, opt + n);
    for (i = n - k; i >= 0; i--) {
        m = n - 1 - i;
        if (i == n - k) {
            rp = k * 1.0;
            for (j = m - k + 2; j <= n - k; j++) {
                v1.push_back(j);
            }
            for (j = m + 1; j <= n; j++) {
                v2.push_back(j);
            }
            for (j = 0; j < v1.size() || j < v2.size(); j++) {
                if (j < v1.size()) {
                    rp *= v1[j];
                }
                if (j < v2.size()) {
                    rp /= v2[j];
                }
            }
        } else {
            rp *= m;
            if (m - 1 - k + 2 >= 1 && m - 1 - k + 2 <= n - k) {
                rp /= m - 1 - k + 2;
            }
        }
        ans += rp * opt[i];
    }
    printf("%.10lf\n", ans);
    return 0;
}