#include <bits/stdc++.h>
using namespace std;
vector<long long> highest;
long long n,m;
vector<long long> A;
vector<long long> B;
bool check(long long mid){
	long long ret = 0;
	for(int i = 0;i<n;i++){
		if (B[i] > A[i]){// try to use B[i] for its all of A's classes
			
			if (B[i] * m >= mid){
				long long temp = (mid+B[i] -1) / B[i];
				ret += temp;
			}
			else{
					
				long long temp = (mid - m*B[i] +B[i]-1) / B[i];
				ret += m + temp;
			}
			
		}
		else{
			if (A[i] * m >= mid){
				long long temp = (mid+A[i]-1)/A[i];
				ret += temp;
			}
			else{
				long long temp = (mid - m*A[i] + B[i] - 1) / B[i];
				ret += m + temp;
			}
		}
		if (ret > n * m){
			return false;
		}
	}
	return ret <= n * m;
}
void bsta(){
	long long lb = 0;
	long long ub = 1e18;
	long long mid = -1;
	long long ans = -1;
	while (lb <= ub){
		mid = (lb + ub) / 2;
		if (check(mid)){
			ans = mid;
			lb = mid + 1;
		}
		else{
			ub = mid - 1;
		}
	}
	cout << ans;
}
int main() {
	
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> m;
    A.resize(n);
    B.resize(n);
    highest.resize(n,0);
    for(int i = 0;i<n;i++){
		cin >> A[i];
		highest[i] = max(highest[i],A[i]);
	}
	for(int i = 0;i<n;i++){
		cin >> B[i];
		highest[i] = max(highest[i],B[i]);
	}
	bsta();
	
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |