#include using namespace std; using ll = long long; constexpr ll INF = 1e12; constexpr int LIMIT = 1e5 + 10; vector divisors(int n) { vector lower, upper; for (int i = 1; i * i <= n; i++) { if (n % i == 0) { lower.push_back(i); if (i != n / i) { upper.push_back(n / i); } } } reverse(upper.begin(), upper.end()); vector divisor; for (int l: lower) { divisor.push_back(l); } for (int u: upper) { divisor.push_back(u); } return divisor; } void solve() { int N; ll K; cin >> N >> K; vector A(N); for (int i = 0; i < N; i++) { cin >> A[i]; } vector B(N); for (int i = 0; i < N; i++) { cin >> B[i]; } vector need_op(N, vector>()); for (int i = 0; i < N; i++) { vector> op; for (int div: divisors(A[i])) { op.emplace_back(div, ((div - B[i]) % div + div) % div); } ll min_cnt = INF; reverse(op.begin(), op.end()); for (auto [key, val]: op) { min_cnt = min(min_cnt, (ll)val); need_op[i].emplace_back(key, min_cnt); } reverse(need_op[i].begin(), need_op[i].end()); } vector imos(LIMIT, 0LL); for (int i = 0; i < N; i++) { for (int j = 0; j < need_op[i].size() - 1; j++) { int curr = need_op[i][j].first, to = need_op[i][j + 1].first; ll val = need_op[i][j + 1].second; imos[curr] += val; imos[to] -= val; } imos[need_op[i][need_op[i].size() - 1].first] += INF; } for (int i = 0; i < LIMIT - 1; i++) { imos[i + 1] += imos[i]; if (imos[i + 1] > K) { cout << i + 1 << "\n"; return; } } } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); solve(); return 0; }