#include<bits/stdc++.h>
using namespace std;
long long N,M,A[5000010],B[5000010],max_time;
bool judge(unsigned long long least_know){
long long empty_time = 0;
for(long long i = 1;i <= N;i++){
unsigned long long now_know = M * max(A[i],B[i]);
if(now_know >= least_know){
empty_time += M - ceil(least_know * 1.0 / max(A[i],B[i]));
}
else{
empty_time -= ceil((least_know - now_know) * 1.0 / B[i]);
}
}
return empty_time >= 0;
}
int main(){
cin >> N >> M;
for(unsigned long long i = 1;i <= N;i++){
cin >> A[i];
max_time = max(max_time,A[i]);
}
for(unsigned long long i = 1;i <= N;i++){
cin >> B[i];
max_time = max(max_time,B[i]);
}
unsigned long long l = 1,r = M * max_time,mid,ans = 0;
while(l <= r){
mid = (l + r) / 2;
if(judge(mid)){
l = mid + 1;
ans = max(ans,mid);
}
else r = mid - 1;
}
cout << ans << endl;
return 0;
}