n, k = gets.split.map(&:to_i)
a = gets.split.map(&:to_i).sort
f = gets.split.map(&:to_i).sort_by{|e| -e}

l = r = 0
n.times {|i| r = a[i] * f[i] if r < a[i] * f[i]}

while l != r
    m = (l + r) / 2
    s = 0

    n.times do |i|
        break if s > k
        s += a[i] * f[i] > m ? (a[i] * f[i] - m).fdiv(f[i]).ceil : 0
    end

    s > k ? l = m + 1 : r = m
end

puts l