结构体sort排序,再用高精度保存答案,找出最小值。
#include<bits/stdc++.h>
using namespace std;
long long kao,m;
int n,a[20010],b[20010]={1,1},c[20010],d[20010];
struct hahaha{
int q,w,e;
}ha[1010];
bool sf7(hahaha a,hahaha b){
return a.e<b.e;
}
void sf1(int x){
memset(a,0,sizeof(a));
for(int z=1;z<=b[0];++z){
b[z]*=x;
a[z+1]=b[z]/10;
b[z]%=10;
}
for(int z=1;z<=b[0]+3;++z){
b[z]+=a[z];
if(b[z]>=10){
b[z+1]+=(b[z]/10);
b[z]%=10;
}
if(b[z]!=0) b[0]=max(b[0],z);
}
}
void sf2(int x){
memset(d,0,sizeof(d));
int y=0;
for(int z=b[0];z>=1;--z){
d[z]=(y*10+b[z])/x;
y=(y*10+b[z])%x;
if(!d[0]&&d[z]) d[0]=z;
}
}
bool sf3(){
if(d[0]>c[0]) return 1;
if(d[0]==c[0])
for(int z=d[0];z>=1;--z){
if(d[z]>c[z]) return 1;
if(d[z]<c[z]) return 0;
}
return 0;
}
void sf(){
ha[0].q=kao;
for(int z=1;z<=n;++z){
sf1(ha[z-1].q);
sf2(ha[z].w);
if(sf3()) for(int z=0;z<=d[0];++z) c[z]=d[z];
}
for(int z=c[0];z>=1;--z) printf("%d",c[z]);
}
int main(){
// freopen("game.in","r",stdin);
// freopen("game.out","w",stdout);
scanf("%d%lld%d",&n,&kao,&m);
m=0;
for(int z=1;z<=n;++z){
scanf("%d%d",&ha[z].q,&ha[z].w);
ha[z].e=ha[z].q*ha[z].w;
}
sort(ha+1,ha+n+1,sf7);
if(n>=100){
sf();
return 0;
}
for(int z=1;z<=n;++z){
if(m<kao/ha[z].w) m=kao/ha[z].w;
kao*=ha[z].q;
}
printf("%lld",m);
}