#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
/**
* JOI 2021/2022 Final Round - Task 2
* Mantık: Minimum kavrama düzeyini X yapmak için gereken toplam ders saatini hesapla.
* Eğer toplam saat <= N * M ise X değeri ulaşılabilir bir değerdir.
*/
bool check(ll mid, int N, ll M, const vector<ll>& A, const vector<ll>& B) {
ll total_needed_hours = 0;
ll total_available_hours = N * M;
for (int i = 0; i < N; i++) {
ll current_needed = 0;
// Bu ders için en verimli çalışma biçimini seç (Kendi dersine girmek vs Bireysel çalışmak)
ll best_per_hour = max(A[i], B[i]);
// Eğer hedef X (mid), sadece en iyi verimle M saatte tamamlanabiliyorsa
if (mid <= best_per_hour * M) {
// Sadece bu ders için ayrılan sürelerde (veya daha azında) hedefe ulaşabiliriz
current_needed = (mid + best_per_hour - 1) / best_per_hour;
} else {
// Kendi ders saatleri (M) yetmiyor, ek olarak B[i] verimiyle ekstra saat lazım
ll remaining_score = mid - (best_per_hour * M);
current_needed = M + (remaining_score + B[i] - 1) / B[i];
}
total_needed_hours += current_needed;
// Taşma kontrolü ve erken çıkış
if (total_needed_hours > total_available_hours) return false;
}
return total_needed_hours <= total_available_hours;
}
int main() {
// Giriş hızlandırma
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int N;
ll M;
if (!(cin >> N >> M)) return 0;
vector<ll> A(N), B(N);
for (int i = 0; i < N; i++) cin >> A[i];
for (int i = 0; i < N; i++) cin >> B[i];
// İkili arama aralığı: [0, max_possible_score]
ll low = 0, high = 2e18; // 1e9 * 1e9 civarı bir üst sınır
ll ans = 0;
while (low <= high) {
ll mid = low + (high - low) / 2;
if (mid == 0) {
low = mid + 1;
continue;
}
if (check(mid, N, M, A, B)) {
ans = mid;
low = mid + 1;
} else {
high = mid - 1;
}
}
cout << ans << endl;
return 0;
}