#include<bits/stdc++.h>
using namespace std;
long long l[500]={0};
long long base[500]={1};
long long ans[500]={0};
struct node{
int l,r;
};
bool comp(node x,node y)
{
return x.l*x.r<y.l*y.r;
}
void maxn(long long *ans,long long *l) //大小判断
{
bool flag=false;
int len1,len2;
for(len1=499;ans[len1]==0;len1--);
for(len2=499;l[len2]==0;len2--);
if(len1<len2)
flag=true;
else if(len1==len2)
{
for(int i=len1;i>=0;i--)
if(ans[i]<l[i])
flag=true;
}
if(flag)
{
for(int i=0;i<500;i++)
ans[i]=l[i];
}
}
void mul(int m) //乘法
{
for(int i=0;i<500;i++)
base[i]*=m;
for(int i=0;i<499;i++)
base[i+1]+=base[i]/10000000,base[i]%=10000000; //压位
}
void div(int m) //除法
{
for(int i=0;i<500;i++)
l[i]=base[i];
int d;
long long mid[500]={0};
for(d=499;l[d]==0;d--); //定位到数首
long long s;
for(int i=d;i>=0;i--)
{
mid[i]=l[i]/m;
if(mid[i]>0)
l[i]-=mid[i]*m;
if(i>0)
l[i-1]+=l[i]*10000000;
}
for(int i=0;i<500;i++)
l[i]=mid[i];
}
int main()
{
int n;
scanf("%d",&n);
node dc[n+1];
for(int i=0;i<=n;i++)
scanf("%d%d",&dc[i].l,&dc[i].r);
sort(dc+1,dc+n+1,comp);
//运算
for(int i=1;i<=n;i++)
{
mul(dc[i-1].l);
div(dc[i].r);
maxn(ans,l);
}
//输出
int d;
for(d=499;ans[d]==0&&d>=0;d--);
bool flag=false;
for(int i=d;i>=0;i--)
printf("%lld",ans[i]),flag=true;
if(!flag)
printf("0");
}
2166489661101032350678866897536628698296804147316726878162441737980268621335310233327258927458239967674879428851028800069063620140885606400000000000000000
21664896611010323506788668975366286982968041473167268781624417379802686213353102333272589274582399676748794288512880006906362140885606400000