n = read_line.to_i b = read_line.to_i64 cs = [] of Tuple(Int64, Int64) c = read_line.split.map(&.to_i64) s = read_line.split.map(&.to_i64) n.times do |i| cs << {c[i], s[i]} end cs.sort! pos = 0 ans = 0 tb = b n.times do |i| if tb < cs[i][0] * cs[i][1] ans += tb // cs[i][0] break end tb -= cs[i][0] * cs[i][1] ans += cs[i][1] pos += 1 end if pos == n puts ans exit end if pos > 0 idx = (0...pos).max_by { |i| (cs[i][0] - 1) * cs[i][1] } ans = {ans, solve(cs, b, idx)}.max end ans = {ans, solve(cs, b, pos)}.max if pos < n - 1 idx = (pos...n).max_by { |i| cs[i][1] } ans = {ans, solve(cs, b, idx)}.max end puts ans def solve(cs, b, idx) if b < cs[idx][1] ta = b else ta = cs[idx][1] tb = b - ta cs.size.times do |i| next if i == idx if tb < cs[i][0] * cs[i][1] ta += tb // cs[i][0] break end tb -= cs[i][0] * cs[i][1] ta += cs[i][1] end end ta end