An e-commerce startup pitches to the investors to get funding. They have been functional for n weeks now and also have a website!

For each week they know the number of unique visitors during this week vi and the revenue ci. To evaluate the potential of the startup at some range of weeks from l to r inclusive investors use the minimum among the maximum number of visitors multiplied by 100 and the minimum revenue during this period, that is: 

<image>

The truth is that investors have no idea how to efficiently evaluate the startup, so they are going to pick some k random distinct weeks li and give them to managers of the startup. For each li they should pick some ri ≥ li and report maximum number of visitors and minimum revenue during this period.

Then, investors will calculate the potential of the startup for each of these ranges and take minimum value of p(li, ri) as the total evaluation grade of the startup. Assuming that managers of the startup always report the optimal values of ri for some particular li, i.e., the value such that the resulting grade of the startup is maximized, what is the expected resulting grade of the startup? 

Input

The first line of the input contains two integers n and k (1 ≤ k ≤ n ≤ 1 000 000).

The second line contains n integers vi (1 ≤ vi ≤ 107) — the number of unique visitors during each week.

The third line contains n integers ci (1 ≤ ci ≤ 107) —the revenue for each week.

Output

Print a single real value — the expected grade of the startup. Your answer will be considered correct if its absolute or relative error does not exceed 10 - 6. 

Namely: let's assume that your answer is a, and the answer of the jury is b. The checker program will consider your answer correct, if <image>.

Examples

Input

3 2
3 2 1
300 200 300


Output

133.3333333

Note

Consider the first sample.

If the investors ask for li = 1 onwards, startup will choose ri = 1, such that max number of visitors is 3 and minimum revenue is 300. Thus, potential in this case is min(3·100, 300) = 300.

If the investors ask for li = 2 onwards, startup will choose ri = 3, such that max number of visitors is 2 and minimum revenue is 200. Thus, potential in this case is min(2·100, 200) = 200.

If the investors ask for li = 3 onwards, startup will choose ri = 3, such that max number of visitors is 1 and minimum revenue is 300. Thus, potential in this case is min(1·100, 300) = 100.

We have to choose a set of size 2 equi-probably and take minimum of each. The possible sets here are : {200, 300},{100, 300},{100, 200}, effectively the set of possible values as perceived by investors equi-probably: {200, 100, 100}. Thus, the expected value is (100 + 200 + 100) / 3 = 133.(3).
import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;

public class E {

	final boolean ONLINE_JUDGE = System.getProperty("ONLINE_JUDGE") != null;
	BufferedReader in;
	PrintWriter out;
	StringTokenizer tok = new StringTokenizer("");

	void solve() throws IOException {
		int t = 1;
		while (t-- > 0) {
			solveTest();
		}
	}
	class SparseTableMin {
		int[][] table;
		int[] log;
		int[] x;
		int n;
		int size;

		public SparseTableMin(int[] x, int n) {
			this.n = n;
			this.x = x;
			size = 1;
			int count = 1;
			while (count * 2 <= n) {
				count *= 2;
				size++;
			}
			table = new int[size][];
			log = new int[n + 1];

			table[0] = new int[n];
			for(int i = 0; i < n; i++) {
				table[0][i] = x[i];
			}
			count = 1;
			for(int i = 1; i < size; i++) {
				count *= 2;
				int max = n - count + 1;
				table[i] = new int[max];
				for(int j = 0; j < max; j++) {
					int left = table[i-1][j];
					int right = table[i-1][j+count/2];
					if(left < right) {
						table[i][j] = left;
					} else {
						table[i][j] = right;
					}
				}
			}

			log[1] = 0;
			int next = 2;
			for(int i = 2; i <= n; i++) {
				log[i] = log[i-1];
				if(i == next) {
					next <<= 1;
					log[i]++;
				}
			}
		}

		public int getMin(int left, int right) {
			int d = right - left + 1;
			int l = log[d];
			int pow = 1 << l;
			int x1 = table[l][left];
			int x2 = table[l][right-pow+1];
			if(x1 < x2) {
				return x1;
			} else {
				return x2;
			}
		}
	}

	class SparseTableMax {
		int[][] table;
		int[] log;
		int[] x;
		int n;
		int size;

		public SparseTableMax(int[] x, int n) {
			this.n = n;
			this.x = x;
			size = 1;
			int count = 1;
			while (count * 2 <= n) {
				count *= 2;
				size++;
			}
			table = new int[size][];
			log = new int[n + 1];

			table[0] = new int[n];
			for(int i = 0; i < n; i++) {
				table[0][i] = x[i];
			}
			count = 1;
			for(int i = 1; i < size; i++) {
				count *= 2;
				int max = n - count + 1;
				table[i] = new int[max];
				for(int j = 0; j < max; j++) {
					int left = table[i-1][j];
					int right = table[i-1][j+count/2];
					if(left > right) {
						table[i][j] = left;
					} else {
						table[i][j] = right;
					}
				}
			}

			log[1] = 0;
			int next = 2;
			for(int i = 2; i <= n; i++) {
				log[i] = log[i-1];
				if(i == next) {
					next <<= 1;
					log[i]++;
				}
			}
		}

		public int getMax(int left, int right) {
			int d = right - left + 1;
			int l = log[d];
			int pow = 1 << l;
			int x1 = table[l][left];
			int x2 = table[l][right-pow+1];
			if(x1 < x2) {
				return x2;
			} else {
				return x1;
			}
		}
	}

	class ONSparseTableMin {
		int[] x;
		int[] prefix;
		int[] suffix;
		int[] blockH;
		SparseTableMin table;
		int n;
		int blockSize;
		int blockCount;

		public ONSparseTableMin(int[] x) {
			this.x = x;
			this.n = x.length;
			int size = 1;
			int count = 1;
			while (count * 2 <= n) {
				count *= 2;
				size++;
			}
			size /= 2;
			if(size == 0) {
				size = 1;
			}
			blockSize = size;
			blockCount = (n + blockSize - 1) / blockSize;

			blockH = new int[blockCount];
			prefix = new int[n];
			suffix = new int[n];

			for(int i = 0, index = 0; i < n; i += blockSize, index++) {
				int start = i;
				int end = i + blockSize;
				if(end > n) {
					end = n;
				}

				int curRes = x[i];
				prefix[i] = x[i];
				for(int j = start + 1; j < end; j++) {
					if(curRes > x[j]) {
						curRes = x[j];
						prefix[j] = x[j];
					} else {
						prefix[j] = prefix[j-1];
					}
				}
				suffix[end-1] = x[end-1];
				for(int j = end-2; j >= start; j--) {
					if(suffix[j+1] > x[j]) {
						suffix[j] = x[j];
					} else {
						suffix[j] = suffix[j+1];
					}
				}
				blockH[index] = curRes;
			}
			table = new SparseTableMin(blockH, blockCount);
		}

		int getMin(int left, int right) {
			int leftBlock = left / blockSize;
			int rightBlock = right / blockSize;
			if(leftBlock == rightBlock) {
				int res = x[left];
				for(int i = left+1; i <= right; i++) {
					if(res > x[i]) {
						res = x[i];
					}
				}
				return res;
			} else {
				int a = suffix[left];
				int b = prefix[right];
				int min = a < b ? a : b;
				if (leftBlock == rightBlock - 1) {
					return min;
				} else {
					int m = table.getMin(leftBlock+1, rightBlock-1);
					return min < m ? min : m;
				}
			}
		}
	}

	class ONSparseTableMax {
		int[] x;
		int[] prefix;
		int[] suffix;
		int[] blockH;
		SparseTableMax table;
		int n;
		int blockSize;
		int blockCount;

		public ONSparseTableMax(int[] x) {
			this.x = x;
			this.n = x.length;
			int size = 1;
			int count = 1;
			while (count * 2 <= n) {
				count *= 2;
				size++;
			}
			size /= 2;
			if(size == 0) {
				size = 1;
			}
			blockSize = size;
			blockCount = (n + blockSize - 1) / blockSize;

			blockH = new int[blockCount];
			prefix = new int[n];
			suffix = new int[n];
			for(int i = 0, index = 0; i < n; i += blockSize, index++) {
				int start = i;
				int end = i + blockSize;
				if(end > n) {
					end = n;
				}

				int curRes = x[i];
				prefix[i] = x[i];
				for(int j = start + 1; j < end; j++) {
					if(curRes < x[j]) {
						curRes = x[j];
						prefix[j] = x[j];
					} else {
						prefix[j] = prefix[j-1];
					}
				}
				suffix[end-1] = x[end-1];
				for(int j = end-2; j >= start; j--) {
					if(suffix[j+1] < x[j]) {
						suffix[j] = x[j];
					} else {
						suffix[j] = suffix[j+1];
					}
				}
				blockH[index] = curRes;
			}
			table = new SparseTableMax(blockH, blockCount);
		}

		int getMax(int left, int right) {
			int leftBlock = left / blockSize;
			int rightBlock = right / blockSize;
			if(leftBlock == rightBlock) {
				int res = x[left];
				for(int i = left+1; i <= right; i++) {
					if(res < x[i]) {
						res = x[i];
					}
				}
				return res;
			} else {
				int a = suffix[left];
				int b = prefix[right];
				int max = a > b ? a : b;
				if (leftBlock == rightBlock - 1) {
					return max;
				} else {
					int m = table.getMax(leftBlock+1, rightBlock-1);

					return max > m ? max : m;
				}
			}
		}
	}

	void solveTest() throws IOException {
		int n = readInt();
		int k = readInt();
		int[] v = new int[n];
		int[] c = new int[n];
		for(int i = 0; i < n; i++) {
			v[i] = readInt() * 100;
		}
		for(int i = 0; i < n; i++) {
			c[i] = readInt();
		}

		int[] res = new int[n];
		ONSparseTableMax spV = new ONSparseTableMax(v);
		ONSparseTableMin spC = new ONSparseTableMin(c);

		for(int i = 0; i < n; i++) {
			int l = i + 1;
			int r = n - 1;
			int ans = Math.min(v[i], c[i]);
			int ansIndex = i;
			if(c[i] <= v[i]) {
				res[i] = c[i];
				continue;
			}

			while (l <= r) {
				int m = (l + r) / 2;
				int min = spC.getMin(i, m);
				int max = spV.getMax(i, m);
				if(min <= max) {
					r = m - 1;
				} else {
					ans = max;
					ansIndex = m;
					l = m + 1;
				}
			}
			if(ansIndex != n-1) {
				int min = spC.getMin(i, ansIndex+1);
				int max = spV.getMax(i, ansIndex+1);
				int tmp = min < max ? min : max;
				if(tmp > ans) {
					ans = tmp;
				}
			}
			res[i] = ans;
		}

		Arrays.sort(res);
		double ans = 0;
		double p = 1;
		int rest = n;
		for(int i = 0; i <= n-k; i++) {
			double curP = p * k / rest;
			p *= (rest-k) * 1.0 / rest;
			rest--;
			ans += curP * res[i];
		}
		out.println(ans);
	}

	void init() throws FileNotFoundException {
		if (ONLINE_JUDGE) {
			in = new BufferedReader(new InputStreamReader(System.in));
			out = new PrintWriter(System.out);
		} else {
			in = new BufferedReader(new FileReader("input.txt"));
			out = new PrintWriter("output.txt");
		}
	}

	String readString() throws IOException {
		while (!tok.hasMoreTokens()) {
			tok = new StringTokenizer(in.readLine());
		}
		return tok.nextToken();
	}

	int readInt() throws IOException {
		return Integer.parseInt(readString());
	}

	long readLong() throws IOException {
		return Long.parseLong(readString());
	}

	double readDouble() throws IOException {
		return Double.parseDouble(readString());
	}

	int[] readArr(int n) throws IOException {
		int[] res = new int[n];
		for (int i = 0; i < n; i++) {
			res[i] = readInt();
		}
		return res;
	}

	long[] readArrL(int n) throws IOException {
		long[] res = new long[n];
		for (int i = 0; i < n; i++) {
			res[i] = readLong();
		}
		return res;
	}

	public static void main(String[] args) {
		new E().run();
	}

	public void run() {
		try {
			long t1 = System.currentTimeMillis();
			init();
			solve();
			out.close();
			long t2 = System.currentTimeMillis();
			System.err.println("Time = " + (t2 - t1));
		} catch (Exception e) {
			e.printStackTrace(System.err);
			System.exit(-1);
		}
	}
}