n, k = read_line.split.map(&.to_i64) a = read_line.split.map(&.to_i) b = read_line.split.map(&.to_i) cnt = Array.new(n) do |i| divs = [] of Int32 d = 1 while d * d < a[i] if a[i] % d == 0 divs << d << a[i] // d end d += 1 end if d * d == a[i] divs << d end c = [] of Tuple(Int32, Int64) divs.sort.each do |d| rem = b[i] % d use = rem == 0 ? 0 : d - rem while c.size > 0 && c[-1][1] >= use c.pop end c << {d, use.to_i64} end c end lo = 1 hi = a.min + 1 while hi - lo > 1 mid = (lo + hi) // 2 need = n.times.sum do |i| idx = cnt[i].bsearch_index { |x, _| x[0] >= mid }.not_nil! cnt[i][idx][1] end if need <= k lo = mid else hi = mid end end puts lo