高精度60pts 玄关求条
查看原帖
高精度60pts 玄关求条
1110209
Eater_Tree楼主2025/6/23 19:28

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;
}
2025/6/23 19:28
加载中...