#include<iostream>
#include<algorithm>
using namespace std;
struct peo{
int left;
int right;
long long x;
};
bool cmp(const peo&a, const peo&b){ // 结构体排序函数
return a.x<b.x;
}
peo p[1001];
int n=1;
long long a[4005]={};
void cal(){
a[0]=1;
int len=1;
int b=p[n].right;
for(int i=0;i<n;i++){ // 高精度乘法
for(int j=0;j<len;j++){
a[j]*=p[i].left;
}
for(int j=0;j<len;j++){
if(a[j]>=10){
a[j+1]+=a[j]/10;
a[j]%=10;
if(j==len-1) len++;
}
}
}
if(len<=1){ // 这里除了特判以外还有什么别的方法吗?
if(len==0) printf("0");
else {
for(int i=1;i<n;i++){
if(p[i].right<=a[0]) printf("%d", a[0]/p[i].right);
break;
}
}
return;
}
bool pd=false;
for(int i=len-1;i>=0;i--){ // 高精度除法
if(a[i]<b){
if(!pd) len--;
if(i>0) a[i-1]+=a[i]*10;
a[i]=0;
}
else{
pd=true;
if(i>0) a[i-1]+=(a[i]%b)*10;
a[i]/=b;
}
}
for(int i=0;i<len;i++){ // 检查进位
if(a[i]>=10){
a[i+1]+=a[i]/10;
a[i]%=10;
if(i==len-1) len++;
}
}
for(int i=len-1;i>=0;i--) printf("%d", a[i]); // 逆序输出
return ;
}
int main(){
cin>>n;
for(int i=0;i<=n;i++){
scanf("%d %d", &p[i].left, &p[i].right);
p[i].x=p[i].left*p[i].right;
}
sort(p+1, p+n+1, cmp);
cal();
return 0;
}
#10 #11 的那个结尾数据不知道怎么处理,只好特判通过,求助。回复一定关注orz