貌似这道题是碰巧蒙对了贪心的方式..就是把ai*bi越小的放在越前面
(不过也符合直觉)
然后统计答案需要用高精度,然后就调了一年
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<cmath>
#include<ctime>
#define LL long long int
using namespace std;
const int maxn=; LL rd(){
LL x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} int N,a0,b0;
struct Node{
int a,b,c;
}p[maxn];
int A[maxn],ans[maxn],tmp[maxn]; inline bool cmp(Node a,Node b){return a.c<b.c;} void times(int x){
memset(tmp,,sizeof(tmp));
for(int i=;i<=A[];i++){
A[i]=A[i]*x;
tmp[i+]=A[i]/;
A[i]%=;
}for(int i=;i<=A[]+;i++){
A[i]+=tmp[i];tmp[i+]+=A[i]/;A[i]%=;
if(A[i]) A[]=max(A[],i);
}
}
void div(int x){
memset(tmp,,sizeof(tmp));int t=;
bool bigger=;
for(int i=A[];i;i--){
t=t*+A[i];
if(t>=x){
tmp[i]=t/x;t%=x;
tmp[]=max(tmp[],i);
if(tmp[]<ans[]) return;
if(tmp[i]<ans[i]&&!bigger) return;
if(tmp[i]>ans[i]) bigger=;
}if(bigger) ans[i]=tmp[i];
}ans[]=max(tmp[],ans[]);
} void output(int *a){
for(int i=a[];i;i--) printf("%d",a[i]);
if(!a[]) printf("");
printf("\n");
} int main(){
int i,j,k;
N=rd();a0=rd();b0=rd();
for(i=;i<=N;i++) p[i].a=rd(),p[i].b=rd(),p[i].c=p[i].a*p[i].b;
sort(p+,p+N+,cmp); A[]=;A[]=;times(a0);
div(p[].b);times(p[].a);
for(i=;i<=N;i++){ div(p[i].b);
times(p[i].a); }output(ans);
return ;
}