#include #include #include #include using namespace std; using namespace atcoder; using ll = long long; using lb = long double; using P = pair; using T = tuple; using vll = vector; using vb = vector; using vvll = vector>; using vP = vector

; using Graph = vector>; using WGraph = vector>>; // コスト、頂点番号の順 using mint = modint998244353; //using mint = long double; #define rep(i, n) for (ll i = 0; i < (ll)(n); i++) mt19937_64 rng(58); long double PI = 3.14159265358979; const ll LLMAX = 9223372036854775807; const ll INF = 1e18; vector di = {-1, 0, 1, 0}; // 上左下右 vector dj = {0, -1, 0, 1}; template inline bool chmax(T &a, T b) { return ((a < b) ? (a = b, true) : (false)); } template inline bool chmin(T &a, T b) { return ((a > b) ? (a = b, true) : (false)); } ll GCD(ll a, ll b) { while (a >= 1 && b >= 1) { if (a >= b) a = a % b; else b = b % a; } if (a != 0) return a; return b; } int main() { ll n, k; cin >> n >> k; vll a(n), b(n); rep (i, n) cin >> a[i]; rep (i, n) cin >> b[i]; vvll divA(n); rep (i, n) { for (ll div = 1; div * div <= a[i]; div++) { if (a[i] % div == 0) { divA[i].push_back(div); divA[i].push_back(a[i] / div); } } sort(divA[i].rbegin(), divA[i].rend()); } priority_queue, greater

> q; rep (i, n) { q.push({gcd(a[i], b[i]), i}); } ll ans = 1; while (k >= 0) { auto [pg, pi] = q.top(); q.pop(); ans = pg; ll div = 0; // backで参照する時注意 while (!divA[pi].empty() && pg >= divA[pi].back()) divA[pi].pop_back(); if (divA[pi].empty()) break; div = divA[pi].back(); // 普通にこれでいい、次へ進めるのはこれで簡単にいける k -= div - b[pi] % div; b[pi] += div - b[pi] % div; if (divA[pi].size() != 0) div = gcd(a[pi] / div, b[pi] / div) * div; if (k < 0) break; if (divA[pi].size() != 0) q.push({div, pi}); } cout << ans << endl; return 0; // 全てをb[i]が全て1、a[i]が10^5以下の数で一番約数の数が多い数、にすると落ちるかも? }