高精直接贺的,应该没错。
然后我就不理解了/yun
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<iostream>
#include<string>
#include<climits>
#include<queue>
#include<vector>
using namespace std;
inline int read()
{
int s=0,w=1;
char ch=getchar();
while(ch<'0' or ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0' and ch<='9')s=s*10+(ch-'0'),ch=getchar();
return s*w;
}
const int INF=1e9+10;
inline int Max(int x,int y){return x>y?x:y;}
inline int Min(int x,int y){return x<y?x:y;}
inline void Swap(int&x,int&y){x^=y;y^=x;x^=y;}
inline int Abs(int x){return x>0?x:-x;}
const int MAXN(1010);
int n;
struct node{int x,y,z;};
node a[MAXN];
inline bool cmp(node x,node y){return x.z<y.z;}
struct BigInteger
{
int d[MAXN],len;
inline void Clear()
{
while(len>1&&!d[len-1]) --len;
return;
}
BigInteger()
{
memset(d,0,sizeof(d));
len=1;
return;
}
BigInteger(int num){*this=num;}
BigInteger(char*num){*this=num;}
BigInteger operator=(const char*num)
{
memset(d,0,sizeof(d));
len=strlen(num);
for(register int i=0;i<len;i++)
d[i]=num[len-i-1]-'0';
Clear();
return *this;
}
BigInteger operator=(int num)
{
char s[20];
sprintf(s,"%d",num);
*this=s;
return *this;
}
BigInteger operator+(const BigInteger&b)
{
BigInteger c=*this;
int i;
for(i=0;i<b.len;i++)
{
c.d[i]+=b.d[i];
if(c.d[i]>9) c.d[i]%=10,++c.d[i+1];
}
while(c.d[i]>9) c.d[i++]%=10,++c.d[i];
c.len=Max(len,b.len);
if(c.d[i]&&c.len<=i) c.len=i+1;
return c;
}
BigInteger operator-(const BigInteger&b)
{
BigInteger c=*this;
int i;
for(i=0;i<b.len;i++)
{
c.d[i]-=b.d[i];
if(c.d[i]<0) c.d[i]+=10,--c.d[i+1];
}
while(c.d[i]<0) c.d[i++]+=10,--c.d[i];
c.Clear();
return c;
}
BigInteger operator*(const BigInteger&b) const
{
BigInteger c;
c.len=len+b.len;
for(register int j=0;j<b.len;j++)
for(register int i=0;i<len;i++)
c.d[i+j]+=d[i]*b.d[j];
for(register int i=0;i<c.len-1;i++)
c.d[i+1]+=c.d[i]/10,c.d[i]%=10;
c.Clear();
return c;
}
BigInteger operator/(const BigInteger&b)
{
BigInteger c=*this,a=0;
for(register int i=len-1;i>=0;i--)
{
a=a*10+d[i];
int j;
for(j=0;j<10;j++)
if(a<b*(j+1)) break;
c.d[i]=j;
a=a-b*j;
}
c.Clear();
return c;
}
bool operator<(const BigInteger&b) const
{
if(len!=b.len) return len<b.len;
for(register int i=len-1;i>=0;i--)
if(d[i]!=b.d[i]) return d[i]<b.d[i];
return false;
}
string str() const
{
char s[MAXN]={};
for(register int i=0;i<len;i++)
s[len-1-i]=d[i]+'0';
return s;
}
};
BigInteger maxx=0,ans=0;
ostream&operator<<(ostream&out,const BigInteger&x)
{
cout<<x.str();
return out;
}
int main()
{
freopen("read.txt","r",stdin);
n=read();
for(register int i=0;i<=n;i++)
{
a[i].x=read(),a[i].y=read();
a[i].z=a[i].x*a[i].y;
}
sort(a+1,a+1+n,cmp);
ans=a[0].x;
for(register int i=1;i<=n;i++)
{
BigInteger now=ans/a[i].y;
if(maxx<now) maxx=now;
now=a[i].x;
ans=ans*now;
}
cout<<maxx<<endl;
return 0;
}