提交时间:2024-03-13 20:22:25

运行 ID: 138095

#include <stdio.h> #include <string.h> #define MOD 10000 struct Node { int a,b; }; void mul(int *a,int b,int *c) // c=a*b { int len=a[0]; int i; for (i=0;i<len+5;i++) c[i]=0; for (i=1; i<=len; i++) { c[i]+=(a[i]*b); c[i+1]+=(c[i]/MOD); c[i]%=MOD; } while (c[len+1]>0) { len++; c[len+1]+=(c[len]/MOD); c[len]%=MOD; } c[0]=len; } void div(int *a,int b,int *c) // c=a/b { int len=a[0]; int r=0; // 余数 int i; for (i=len; i>=1; i--) { r=r*MOD+a[i]; c[i]=r/b; r=r%b; } while (!c[len]) len--; if (!len) len=1; c[0]=len; } void getMax(int *x,int *y) // x=max(x,y) { if (y[0]<x[0]) return; int i; if (x[0]==y[0]) { for (i=y[0]; i>=1; i--) if (y[i]<x[i]) return; else if (y[i]>x[i]) break; } for (i=0; i<=y[0]; i++) x[i]=y[i]; } int main() { int n; scanf("%d",&n); struct Node m[1005]; int i,j; for (i=0; i<=n; i++) scanf("%d%d",&m[i].a,&m[i].b); for (i=1;i<n;i++) for (j=1;j<=n-i;j++) if (m[j].a*m[j].b>m[j+1].a*m[j+1].b) { struct Node tmp; tmp=m[j]; m[j]=m[j+1]; m[j+1]=tmp; } int p[1100]; // 保存累乘积,每4位1组,p[0]保存位数 int t[1100]; // 中间结果 int ans[1100]; // 最终答案 ans[0]=1; ans[1]=0; p[0]=1; p[1]=1; for (i=1; i<=n; i++) { mul(p,m[i-1].a,t); for (j=0; j<=t[0]; j++) p[j]=t[j]; div(p,m[i].b,t); getMax(ans,t); } printf("%d",ans[ans[0]]); for (i=ans[0]-1; i>=1; i--) printf("%04d",ans[i]); printf("\n"); return 0; }