// #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef unsigned long long ull; typedef long double ld; typedef pair PP; // #define MOD 1000000007 #define MOD 998244353 #define INF 2305843009213693951ll #define PI 3.141592653589 #define setdouble setprecision #define REP(i,n) for(ll i=0;i<(n);++i) #define OREP(i,n) for(ll i=1;i<=(n);++i) #define RREP(i,n) for(ll i=(n)-1;i>=0;--i) #define ORREP(i,n) for(ll i=(n);i>=1;--i) #define rep(i,a,b) for(ll i=(a);i<=(b);++i) #define ALL(v) (v).begin(), (v).end() #define chmin(k,m) k = min(k,m) #define chmax(k,m) k = max(k,m) #define GOODBYE do { cout << "-1" << endl; return 0; } while (false) #define MM <<" "<< #define Endl endl std::vector divisor_enum(long long N){ // Copyright (c) 2023 0214sh7 // https://github.com/0214sh7/library/ std::vector R; if(N<=0)return R; long long s=0; for(long long i=1;i*i<=N;i++){ if(N%i==0){ R.push_back(i); if(i*i!=N)s++; } } for(long long i = s-1;i>=0;i--){ R.push_back(N/R[i]); } return R; } int main(void){ cin.tie(nullptr); ios::sync_with_stdio(false); ll N,K; cin >> N >> K; vector A(N); ll Amin = INF; REP(i,N){ cin >> A[i]; Amin = min(Amin,A[i]); } vector B(N); REP(i,N){cin >> B[i];} vector> dA(N); REP(i,N){ dA[i] = divisor_enum(A[i]); reverse(ALL(dA[i])); } // スコアを mid 以上にするのに K 回以下で済むか ll ok = 0, ng = Amin+1, mid; while(abs(ok-ng)>1){ mid = (ok+ng)/2; ll sum = 0; REP(i,N){ if(gcd(A[i],B[i]) >= mid)continue; ll m = INF; for(ll d:dA[i]){ if(d < mid)break; ll tmp = (d-(B[i]%d))%d; m = min(m,tmp); } sum += m; } // cout << ok MM ng MM mid MM sum << endl; if(sum <= K){ ok = mid; }else{ ng = mid; } } cout << ok << endl; return 0; }