由于不会直接仿着题解第一篇认真抄了一遍,但是不知道哪里有问题 ,求大佬指点
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ull maxn=10005;
inline int read(void);
inline void write(int x);
struct node {
int a, b, l;
char cnta[maxn], all[maxn];
char ca[maxn], ans[maxn];
} E[1001];
bool cmp1(node a, node b) {
return a.a*a.b<b.a*b.b;
}
bool cmp2(node a, node b) {
if(a.l!=b.l) return a.l>b.l;
else for(int i=0; i<a.l; i++) if(a.ans[i]!=b.ans[i]) return a.ans[i]>b.ans[i];
return 1;
}
inline void doit(int a, char b[]) {
int len=0;
while(a>0) b[len++]=a%10+'0', a/=10;
b[len]='\0';
}
inline void add(char c[], char d[], int k) {
int len=strlen(c), tmp, s;
for(int j=0; j<len; j++, k++) {
tmp=(d[k]>0? d[k]-'0':0)+c[j]-'0'+s;
d[k]=tmp%10+'0', s=tmp/10;
}
if(s) d[k++]=s+'0';
d[k]='\0';
}
inline void gc(char a[], char b[], char d[]) {
int lena=strlen(a), lenb=strlen(b);
char c[maxn];
for(int i=0; i<lena; i++) {
int tmp, s=0, lenc=0;
for(int j=0; j<lenb; j++) {
tmp=(a[i]-'0')*(b[j]-'0')+s;
c[lenc++]=tmp%10+'0', s=tmp/10;
}
if(s) c[lenc++]=s+'0';
c[lenc]='\0', add(c, d, i);
}
}
void divi(char a[], int b, char c[]) {
int i=0, tag=0, lena=strlen(a), lenc=0, d=0;
while(i<=lena)
if(b>d) {
d=d*10+a[i++]-'0';
if(tag) c[lenc++]='0';
} else {
c[lenc++]=d/b+'0';
d=d%b;
d=d*10+a[i++]-'0';
tag=1;
}
if(tag==0) c[lenc++]='0';
c[lenc]='\0';
}
int n, ANS=1;
int main() {
cin>>n;
for(int i=0; i<=n; i++) cin>>E[i].a>>E[i].b;
sort(E+1, E+n+1, cmp1);
doit(E[0].a, E[0].ca);
E[0].cnta[0]='1', E[0].cnta[1]='\0';
for(int i=1; i<=n; i++) {
doit(E[i].a, E[i].ca);
gc(E[i-1].cnta, E[i-1].ca, E[i].cnta);
}
for(int i=1; i<=n; i++) {
int k=0;
for(int j=strlen(E[i].cnta)-1; j>=0; j--) E[i].all[k++]=E[i].cnta[j];
E[i].all[k]='\0';
}
for(int i=1; i<=n; i++) {
divi(E[i].all, E[i].b, E[i].ans);
E[i].l=strlen(E[i].ans);
}
for(int i=2; i<=n; i++) if(!cmp2(E[ANS], E[i])) ANS=i;
printf("%s\n", E[ANS].ans);
return 0;
}
inline int read(void) {
int x=0, f=1;
char ch=getchar();
while (ch<'0'||ch>'9') {
if (ch=='-') f=-1;
ch=getchar();
}
while (ch>='0'&&ch<='9') {
x=x*10+ch-48;
ch=getchar();
}
return x*f;
}
inline void write(int x) {
if(x<0) x=-x, putchar('-');
if(x>9) write(x/10);
putchar(x%10+'0');
}