WA on #6 #8 #9 #10
#include<bits/stdc++.h>
using namespace std;
int n,a0,b0;
int a[1001000],b[1001000],c[1001000],a1[1001000],c1[1001000],lena;
//a和a1表示高精度乘法(a为正序 a1为倒序)
//c和c1表示高精度除法(c为正序 c1为倒序)
//因为本蒟蒻高精度除法只会用正序做
int ans[1001000],anslen;
struct node{
int a,b;
}m[2000];
int cmp(node x,node y){
return x.a*x.b<y.a*y.b;//贪心
}
int main(){
scanf("%d%d%d",&n,&a0,&b0);
while(a0>0){
a[lena++]=a0%10;
a0/=10;
}
for(int i=1;i<=n;i++)
scanf("%d%d",&m[i].a,&m[i].b);
sort(m+1,m+1+n,cmp);
for(int k=1;k<=n;k++){
memset(a1,0,sizeof(a1));
memset(c1,0,sizeof(c1));
memset(c,0,sizeof(c));
int d=0,len=lena,lenb=0,flag=0;
for(int i=0;i<len;i++){
c[i]=(d*10+a[i])/m[k].b;
d=(d*10+a[i])%m[k].b;
}
for(int i=0;i<len;i++) c1[i]=c[len-i-1];//正序转倒序
while(c1[len-1]==0&&len>1) len--;
//高精度除法
if(len==anslen){
for(int i=anslen-1;i>=0;i--){
if(ans[i]>c1[i]) break;
else if(ans[i]<c1[i]){
flag=1;
break;
}
}
}
if(len>anslen) flag=1;
if(flag=1){
for(int i=0;i<len;i++) ans[i]=c1[i];
anslen=len;
}
//取最大值
memset(c,0,sizeof(c));
while(m[k].a>0){
b[lenb++]=m[k].a%10;
m[k].a/=10;
}
for(int i=0;i<lena;i++) a1[i]=a[lena-i-1];
for(int i=0;i<lena;i++){
for(int j=0;j<lenb;j++){
c[i+j]+=a1[i]*b[j];
c[i+j+1]+=c[i+j]/10;
c[i+j]%=10;
}
}
lena=lena+lenb;
while(c[lena-1]==0&&lena>1) lena--;
//高精度乘法
for(int i=0;i<lena;i++) a[i]=c[lena-i-1];//倒序转正序
}
for(int i=anslen-1;i>=0;i--) printf("%d",ans[i]);
return 0;
}