1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
| #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<vector> #include<queue> #include<climits> #include<cstdlib> using namespace std; typedef long long ll; template <typename T> inline void read(T&x){ int w=0;x=0; char ch = getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') w=1; ch = getchar(); } while(ch>='0'&&ch<='9'){ x = (x<<1)+(x<<3)+(ch^48); ch = getchar(); } if(w) x=-x; } template <typename T,typename...Args> inline void read(T&t,Args&...args){ read(t);read(args...); } const ll N = 5e5; inline ll Max(ll a,ll b){ return (a > b ? a : b); } inline ll Min(ll a,ll b){ return (a < b ? a : b); } inline ll Abs(ll a){ return (a < 0 ? -a : a); } inline ll Gcd(ll x,ll y){ if(!x || !y) return x|y; ll xz = __builtin_ctzll(x); ll yz = __builtin_ctzll(y); ll z = Min(xz,yz),diff; y >>= yz; while(x){ x >>= xz; diff = x-y; xz = __builtin_ctzll(diff); y = Min(x,y); x = Abs(diff); } return y << z; } int n,lg[N+10]={-1}; ll ans,gcdd,st[N+10][20],ai[N+10]; inline ll query(ll l,ll r){ int k = lg[r-l+1]; return Gcd(ans,Gcd(st[l][k],st[r-(1<<k)+1][k])); } int main(){ read(n); ll y; for(int i=1,x;i<=n;++i){ read(x,y); ai[x] = Gcd(ai[x],y); gcdd = Gcd(gcdd,y); } for(int i=1;i<=N;++i){ lg[i] = lg[i>>1]+1; st[i][0] = ai[i]; } for(int k=1;k<20;++k){ for(int l=1;l+(1<<k)<=N+1;++l){ st[l][k] = Gcd(st[l][k-1],st[l+(1<<k-1)][k-1]); } } for(ll i=N;i>gcdd;--i){ ans = 0; ans = query(1,i-1); if(N%i) ans = query(N/i*i+1,N); for(ll j=2;i*j<=N && !(ans%i);++j){ ans = query(i*(j-1)+1,i*j-1); } if(!(ans%i)){ printf("%lld",i); return 0; } } printf("%lld",gcdd); return 0;; }
|