#ifdef t9unkubj #include"debug.cpp" //#include"template_no_debug.h" #else #define dbg(...) 199958 #endif #undef _GLIBCXX_DEBUG #pragma GCC optimize("O3") using namespace std; #include using ll=long long; using ull=unsigned long long; templateusing vc=vector; templateusing vvc=vc>; #define rep(i,n) for(ll i=0;i<(ll)(n);i++) #define REP(i,j,n) for(ll i=(j);i<(ll)(n);i++) #define DREP(i,n,m) for(ll i=(n);i>=(m);i--) #define drep(i,n) for(ll i=((n)-1);i>=0;i--) #define all(x) x.begin(),x.end() #define rall(x) x.rbegin(),x.rend() template bool chmin(T &x, F y){ if(x>y){ x=y; return true; } return false; } template bool chmax(T &x, F y){ if(x struct NUMBER{ vcmf; //[1,n]まで扱う constexpr NUMBER()=default; constexpr void build(){ mf.resize(n); rep(i,n)mf[i]=i; REP(i,2,n){ if(mf[i]==i){ for(int j=i+i;j>factor(int k){ assert(k>res; while(k!=1){ if(res.size()&&res.back().first==mf[k]){ res.back().second++; }else res.push_back({mf[k],1}); k/=mf[k]; } return res; } constexpr vcdivs(int k){ vcans; auto res=factor(k); auto dfs=[&](auto&dfs,int now,int now_idx)->void{ if(now_idx==res.size()){ ans.push_back(now); return; }else{ int coef=1; rep(i,res[now_idx].second+1){ dfs(dfs,now*coef,now_idx+1); coef*=res[now_idx].first; } } }; dfs(dfs,1,0); return ans; } constexpr int mebius(int k){ auto res=factor(k); for(auto[x,y]:res)if(y>=2)return 0; return res.size()%2?-1:1; } }; void solve(){ NUMBERnm; nm.build(); int n; cin>>n; vca(n),b(n); rep(i,n){ cin>>a[i]>>b[i]; b[i]*=a[i]; } vcidx(n); iota(all(idx),0); sort(all(idx),[&](int i,int j){ return b[i]>b[j]; }); vcmi(2e5+1,2e13); ll ans=0; auto work=[&](int x){ auto R=nm.divs(x); for(auto&y:R){ chmin(mi[y],mi[x]); } }; for(auto i:idx){ for(auto&x:nm.divs(a[i])){ chmax(ans,x*b[i]/(mi[x]*a[i])); } chmin(mi[a[i]],a[i]); work(a[i]); } cout<sync_with_stdio(0); pass_time=clock(); int t=1; //cin>>t; while(t--)solve(); pass_time=clock()-pass_time; dbg(pass_time/CLOCKS_PER_SEC); }