#include <bits/stdc++.h>
#define int long long
using namespace std;
const long long N = 300000 + 5;
int a[N];
int b[N];
int n, m;
bool possible(int k)
{
int saved = 0;
for (int i = 0; i < n; i++)
{
int needed = (k + a[i] - 1) / a[i];
if (needed <= m)
{
saved += m - needed;
continue;
}
int left = k - m * a[i];
assert(left >= 0);
int others = (left + b[i] - 1) / b[i];
assert(others >= 0);
saved -= others;
}
return saved >= 0;
}
bool satisfied(int k)
{
int courses = 0;
for (int i = 0; i < n; i++)
{
int usedA = min(m, (k + a[i] - 1) / a[i]);
int left = k - usedA * a[i];
int usedB = (left + b[i] - 1) / b[i];
courses += usedA + usedB;
}
return courses <= n * m;
}
void solve()
{
cin >> n >> m;
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
for (int i = 0; i < n; i++)
{
cin >> b[i];
a[i] = max(a[i], b[i]);
}
int o = 0;
for (int i = 62; i >= 0; i--)
{
int mask = 1ll << i;
if (possible(o + mask) and satisfied(o + mask))
{
o += mask;
}
// cout << mask << endl;
}
cout << o;
// cout << possible(38404721679817) << endl;
}
signed main()
{
ios_base::sync_with_stdio(0);
cin.tie(NULL);
cout.tie(NULL);
int t = 1;
// cin >> t;
for (int i = 1; i <= t; i++)
{
// cout << "Case #" << i << ':' << ' ';
solve();
cout << endl;
}
return 0;
}
| # | 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... |