#include using namespace std; using ll = long long; [[maybe_unused]] constexpr ll INF = (1LL << 60) - 1; void solve() { ll n, k; cin >> n >> k; vector a(n); for (ll i = 0; i < n; ++i) { cin >> a[i]; } vector b(n); for (ll i = 0; i < n; ++i) { cin >> b[i]; } ll ma = *max_element(a.begin(), a.end()); vector> div(ma + 1); for (ll i = 1; i <= ma; ++i) { for (ll j = i; j <= ma; j += i) { div[j].push_back(i); } } // 二分探索: p 未満で条件を満たさず p 以上で条件を満たすような p を返す auto check = [&](ll p) -> bool { ll cnt = 0; for (ll i = 0; i < n; ++i) { ll mn = INF; vector& d = div[a[i]]; ll l = lower_bound(d.begin(), d.end(), p) - d.begin(); ll r = d.size(); for (ll j = l; j < r; ++j) { ll c = ((-b[i]) % d[j] + d[j]) % d[j]; mn = min(mn, c); } if (mn == INF) return false; cnt += mn; } return cnt <= k; }; auto binSearch = [&]() -> ll { ll ng = 1; ll ok = ma + 1; while (ok - ng > 1) { ll mid = (ng + ok) / 2; if (!check(mid)) ok = mid; else ng = mid; } return ng; }; cout << binSearch() << "\n"; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); ll t = 1; // cin >> t; while (t--) { solve(); } return 0; }