Problem:
Enumeration

n個の整数a1, a2, …, anとn個の整数p1, p2, …, pn、整数mが与えられる。k番目の整数akをpk[%]の確率で選ぶ、という操作を各k(1 ≤ k ≤ n)について行い、0個以上n個以下の整数を選び出す。1以上m以下の整数の中で、選ばれた整数の少なくとも1つで割り切れるものの個数の期待値を求めよ。

Input

入力は以下の形式で与えられる。

n m
a1 a2 … an
p1 p2 … pn

Constraints

1 ≤ n ≤ 20

1 ≤ m ≤ 1018

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

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

Output

問題の解を1行に出力せよ。出力には絶対誤差あるいは相対誤差で0.0000001(= 10-7)を超える誤差があってはならない。

Sample Input 1

2 15
3 5
50 50

Output for the Sample Input 1

3.75

確率

選ばれた数字

割り切る数

個数

25%

[]

 

0個

25%

[3]

3 6 9 12 15

5個

25%

[5]

5 10 15

3個

25%

[3,5]

3 5 6 9 10 12 15

7個

よって0.25 × (0 + 5 + 3 + 7) = 3.75

Sample Input 2

4 100
2 3 5 7
80 60 40 20

Output for the Sample Input 2

57.352

Sample Input 3

4 210
2 3 5 7
80 60 40 20

Output for the Sample Input 3

119.9136

Solution in Ruby (judge verdict: Accepted)

def gcd(m, n)
    if m < n
        gcd(n, m)
    elsif n == 0
        m
    else
        gcd(n, m % n)
    end
end

def lcm(m, n)
    m * n / gcd(m, n)
end

n, m = gets.split.map(&:to_i)
num = gets.split.map(&:to_i)
prob = gets.split.map(&:to_i).map {|x| x / 100.0}

exp = 0

qs = [1]
lcms = [1]

(1..2**n-1).each do |x|
    a = (0..n-1).select {|i| x[i] == 1}
    i = a[0]
    y = x & (x - 1)
    qs[x] = qs[y] * prob[i]
    lcms[x] = lcm(lcms[y], num[i])
    k = m / lcms[x]
    exp += (a.size.odd? ? 1 : -1) * k * qs[x]
end
printf("%.9f\n", exp)