#include //#include using namespace std; // using namespace atcoder; // using mint = modint1000000007; // const int mod = 1000000007; // using mint = modint998244353; // const int mod = 998244353; // const int INF = 1e9; const long long LINF = 1e18; #define rep(i, n) for (int i = 0; i < (n); ++i) #define rep2(i, l, r) for (int i = (l); i < (r); ++i) #define rrep(i, n) for (int i = (n)-1; i >= 0; --i) #define rrep2(i, l, r) for (int i = (r)-1; i >= (l); --i) #define all(x) (x).begin(), (x).end() #define allR(x) (x).rbegin(), (x).rend() #define P pair template inline bool chmax(A &a, const B &b) { if (a < b) { a = b; return true; } return false; } template inline bool chmin(A &a, const B &b) { if (a > b) { a = b; return true; } return false; } template T binarySearch(T ok, T ng, const F &f) { while (abs(ok - ng) > 1) { T mid = (ok + ng) / 2; (f(mid) ? ok : ng) = mid; } return ok; } //約数列挙 std::vector divisorEnumeration(long long n) { std::vector x; for (long long i = 1; i*i <= n; i++) { if (0 == n % i) { x.push_back(i); if (n != i * i) x.push_back(n / i); } } std::sort(x.begin(), x.end()); return x; } int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int n; cin >> n; long long k; cin >> k; vectora(n), b(n); rep(i, n)cin >> a[i]; rep(i, n)cin >> b[i]; vector>d(n); rep(i, n)d[i] = divisorEnumeration(a[i]); vector>dp(n); rep(i, n) { dp[i].resize(d[i].size()); rep(j, d[i].size()) { long long x = ((b[i] + d[i][j] - 1) / d[i][j])*d[i][j]; dp[i][j] = x - b[i]; } } vector>dpMN(n); rep(i, n) { dpMN[i].resize(d[i].size() + 1); dpMN[i].back() = LINF; rrep(j, dpMN[i].size() - 1) { dpMN[i][j] = min(dpMN[i][j + 1], dp[i][j]); //chmin(dpMN[i][j], dpMN[i][j + 1]); } } long long mna = a[0]; rep(i, n)chmin(mna, a[i]); auto f = [&](const long long target)->bool { long long sum = 0; rep(i, n) { int count = d[i].end() - lower_bound(all(d[i]), target); long long add = dpMN[i][d[i].size() - count]; // cout << i << " " << add << endl; sum += add; if (sum > k)return false; } return true; }; //f(10); //return 0; auto ans = binarySearch(1, mna + 1, f); cout << ans << endl; return 0; }