Problem: Given n integers a1, a2,…, an and n integers p1, p2,…, pn, integer m. The operation of selecting the kth integer ak with a probability of pk [%] is performed for each k (1 ≤ k ≤ n), and 0 or more and n or less integers are selected. Find the expected number of integers between 1 and m that are divisible by at least one of the selected integers.

Constraints

* 1 ≤ n ≤ 20

* 1 ≤ m ≤ 1018

* 1 ≤ ak ≤ 1018 (1 ≤ k ≤ n)

* 1 ≤ pk ≤ 99 (1 ≤ k ≤ n)

Input

The input is given in the following format.

> n m
> a1 a2… an
> p1 p2… pn
>

Output

Print the solution to the problem on one line. The output must not have an absolute or relative error of more than 0.0000001 (= 10-7).

Examples

Input

2 15
3 5
50 50


Output

3.75


Input

4 100
2 3 5 7
80 60 40 20


Output

57.352


Input

4 210
2 3 5 7
80 60 40 20


Output

119.9136

Solution (in CPP):

Solution:
#include<iostream>
#include<string>
#include<cstdio>
#include<vector>
#include<cmath>
#include<algorithm>
#include<functional>
#include<iomanip>
#include<queue>
#include<ciso646>
#include<random>
#include<map>
#include<set>
#include<complex>
#include<bitset>
#include<stack>
#include<unordered_map>
#include<utility>
using namespace std;
typedef long long ll;
typedef unsigned long long ul;
typedef unsigned int ui;
const ll mod = 1000000007;
typedef double ld;
const ll INF = mod * mod;
typedef pair<int, int> P;
#define stop char nyaa;cin>>nyaa;
#define rep(i,n) for(int i=0;i<n;i++)
#define per(i,n) for(int i=n-1;i>=0;i--)
#define Rep(i,sta,n) for(int i=sta;i<n;i++)
#define rep1(i,n) for(int i=1;i<=n;i++)
#define per1(i,n) for(int i=n;i>=1;i--)
#define Rep1(i,sta,n) for(int i=sta;i<=n;i++)
const ld eps = 1e-8;
const ld pi = acos(-1.0);
typedef pair<ld, ld> LDP;
typedef pair<ll, ll> LP;
#define fr first
#define sc second

string add(string a, string b) {
	reverse(a.begin(), a.end());
	reverse(b.begin(), b.end());
	int len = max(a.length(), b.length());
	int rest = 0; string res;
	rep(i, len + 1) {
		if (i < (int)a.length()) {
			rest += a[i] - '0';
		}
		if (i < (int)b.length()) {
			rest += b[i] - '0';
		}
		res.push_back('0' + (rest % 10));
		rest /= 10;
	}
	while (res.length() && res[res.length() - 1] == '0')res.erase(res.end() - 1);
	reverse(res.begin(), res.end());
	return res;
}
string multi0(int m, string a) {
	string res;
	reverse(a.begin(), a.end());
	int len = a.length();
	int rest = 0;
	rep(i, len) {
		rest += m * (a[i] - '0');
		res.push_back('0' + (rest % 10));
		rest /= 10;
	}
	if (rest)res.push_back('0' + rest);
	reverse(res.begin(), res.end());
	return res;
}
string multi(string a, string b) {
	int len = a.length(); string res = "0";
	per(i, len) {
		int t = a[i] - '0'; int rest = len - i - 1;
		string nex = multi0(t, b);
		rep(j, rest) {
			nex.push_back('0');
		}
		res = add(res, nex);
	}
	return res;
}

int n; ll m;
vector<ll> a;
vector<ld> p;


ll multi(ll a, ll b) {
	string s = to_string(a), t = to_string(b);
	if (s.length() + t.length() < 19)return a * b;
	string st = multi(s, t);
	if (st.length() > 18) {
		if (st != "1000000000000000000") {
			return 0;
		}
	}
	return a * b;
}
ll gcd(ll a, ll b) {
	if (a < b)swap(a, b);
	while (b) {
		ll r = a % b; a = b; b = r;
	}
	return a;
}
ll lcd(ll a, ll b) {
	ll g = gcd(a, b);
	a /= g;
	return multi(a, b);
}
vector<ll> lcm;
//vector<ld> sp;
void init() {
	lcm.resize(1 << n);
	//sp.resize(1 << n,1);
	lcm[0] = 1;
	rep1(i, (1 << n)-1) {
		rep(j, n) {
			if (i&(1 << j)) {
				lcm[i] = lcd(lcm[i ^ (1 << j)], a[j]);
				break;
				//sp[i] *= p[j];
			}
			/*else {
				sp[i] *= 1 - p[j];
			}*/
		}
	}
}

vector<vector<ld>> v;
void solve() {
	cout << fixed << setprecision(8);
	cin >> n >> m;
	a.resize(n); p.resize(n);
	rep(i, n) {
		cin >> a[i];
	}
	rep(i, n) {
		cin >> p[i]; p[i] /= 100.0;
	}
	init();
	v.resize(1 << n);
	ld ans = 0;
	rep1(i, (1 << n) - 1) {
		//cout << lcm[i] << endl;
		int tmp = 0; ld z = 1;
		rep(j, n) {
			if (i&(1 << j))tmp++;
		}
		v[i].resize(tmp,0);
		if(lcm[i]!=0)v[i][tmp - 1] = m/lcm[i];
		if (tmp % 2 == 0)v[i][tmp-1] = -v[i][tmp-1];
		rep(j, n) {
			if (i&(1 << j)) {
				int ni = i ^ (1 << j);
				rep(k, v[ni].size()) {
					v[i][k] += v[ni][k];
				}
				z *= p[j];
			}
			else{
				z *= (1 - p[j]);
			}
		}
		ld sum = 0;
		rep(j, tmp-1) {
			ld c = tmp - j-1;
			v[i][j] /= c;
			sum += v[i][j];
		}
		sum += v[i][tmp - 1];
		//cout << i << " " << sum << endl;
		ans += sum * z;
	}
	cout << ans << endl;
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	solve();
	//stop
	return 0;
}