/*
TASK: socks
LANG: C++
*/

#include <stdio.h>

struct set {
	long socks;
	double price;
} avail[32];
long sets, target, so_far;
double so_far_price;

int main() {
	long i, start = 1, temp, k;
	scanf("%li %li", &sets, &target);
	i = 0;
	while (i <= sets) {
		avail[i].socks = start;
		if (i < sets) {
			scanf("%li", &temp);
			start *= temp;
		}
		i++;
	}
	i = 0;
	while (i <= sets) {
		scanf("%lf", &avail[i].price);
		i++;
	}
	while (so_far < target) {
		if (avail[sets].socks > target-so_far) {
			k = 0;
			while (k <= sets) {
				if (avail[k].socks >= target-so_far) {
					break;
				}
				k++;
			}
			if (k <= sets) {
				so_far += avail[k].socks;
				so_far_price += avail[k].price;
			}
		} else {
			so_far += avail[sets].socks;
			so_far_price += avail[sets].price;
		}
	}
	printf("%.2lf\n", so_far_price);
	return 0;
}
