typedeflonglong LL; constint INF = 0x3f3f3f3f; constint maxn = 1000000 + 10; int pri[maxn]; int a[maxn]; int b[maxn]; bool vis[maxn]; int m[200],n[200]; int num;
voidprime(){ num = 0; memset(vis, false, sizeof(vis)); vis[1] = true; for(int i = 2; i < maxn; ++i){ if (!vis[i]) pri[++num] = i; for(int j = 1; j <= num && i * pri[j] < maxn; ++j){ vis[ i* pri[j]] = true; if (i % pri[j] == 0) break; } } }
intsolve(int n, int t){//求阶乘中有多少个某个素数 int ans = 0; int x = t; while(t <= n){ ans += n / t; t *= x; }return ans; }
LL qpow(LL x, LL n){ LL ans = 1; while(n){ if (n&1) ans *= x; x *= x; n >>= 1; }return ans; }
intmain(){ prime(); int t; while(scanf("%d", &t) != EOF){ int minx = INF; for(int i = 1; i <= t; ++i){ scanf("%d %d", &n[i], &m[i]); minx = min( minx, n[i]); }fill(a, a + maxn, INF); for(int j = 1; j <= t; ++j) for(int i = 1; i <= num && pri[i] <= minx; ++i) a[pri[i]] = min(a[pri[i]],solve(n[j], pri[i]) - solve(m[j], pri[i]) - solve(n[j] - m[j], pri[i])); LL ans = 1; for(int i = 1; i < maxn; ++i){ if(a[i] != INF) ans *= qpow(i, a[i]); } printf("%I64d\n",ans); // cout<<ans<<endl; }return0; }