#include using namespace std; using ll = long long; using P = pair; #define rep(i,n) for(int (i) = 0; i<(n); i++) const int N = 100000; const ll inf = 1e18; int main(){ int n; ll k; cin >> n >> k; vector a(n), b(n); rep(i,n) cin >> a[i]; rep(i,n) cin >> b[i]; // div[i] : i の約数 vector> div(N+10); for(int i=1; i<=N+5; i++){ int j = i; while(j<=N+5){ div[j].push_back(i); j += i; } } // gcd(a[i], b[i]) を div の値にするのに必要な操作回数 vector> min_op(n); rep(i,n){ ll min_cost = inf; for(int j = div[a[i]].size()-1; 0<=j; j--){ ll p = div[a[i]][j]; ll cost = (b[i]%p==0? 0 : p-b[i]%p); if(cost, greater

> q; rep(i,n) q.push(P(min_op[i][0].first, i)); while(q.size()){ auto [g, i] = q.top(); if(g==a[i]) break; q.pop(); ll c1 = (*lower_bound(min_op[i].begin(), min_op[i].end(), P(g, 0))).second; auto [g2, c2] = *upper_bound(min_op[i].begin(), min_op[i].end(), P(g, inf)); if(0<=k+c1-c2){ k = k+c1-c2; q.push(P(g2, i)); } else{ q.push(P(g, i)); break; } } cout << min(q.top().first, *min_element(a.begin(), a.end())) << endl; }