TLE最后一个点(
查看原帖
TLE最后一个点(
380950
2020wty楼主2023/11/8 20:27
#include<iostream>
#include<cstdio>
#define re register int
#define il inline
using namespace std;
const int N=1e4+10;
string ch,ch1;
int a[N],b[N],lena,lenb,lenc,c[N],lent,t[N],cc[N],lencc,lend,d[N];
il bool pd(){
	if(lena<lenb)return 1;
	if(lenb<lena)return 0;
	for(re i=lena;i>=1;i--){
		if(a[i]<b[i])return 1;
		if(a[i]>b[i])return 0;
	}
	return 1;
}
int main(){
	cin>>ch;
	lena=ch.length();
	for(re i=lena;i>=1;i--)a[i]=ch[lena-i]-'0';
	cin>>ch1;
	lenb=ch1.length();
	for(re i=lenb;i>=1;i--)b[i]=ch1[lenb-i]-'0';
	lencc=1;
	cc[lencc]=1;
	while(1){
		if(pd()){
			lent=lena;
			for(re i=1;i<=lent;i++)t[i]=a[i];
			lena=lenb;
			for(re i=1;i<=lenb;i++)a[i]=b[i];
			lenb=lent;
			for(re i=1;i<=lent;i++)b[i]=t[i];
		}
		if(lenb==1&&b[1]==0){
//			cout<<lencc<<" "<<cc[1]<<endl;
			lend=lencc+lena;
			for(re i=1;i<=lencc;i++){
				int x=0;
				for(re j=1;j<=lena;j++){
					d[i+j-1]=d[i+j-1]+x+cc[i]*a[j];
					x=d[i+j-1]/10;
					d[i+j-1]%=10;
				}
				d[i+lena]=x;
			}
			while(lend>1&&d[lend]==0)lend--;
			for(re i=lend;i>=1;i--)printf("%d",d[i]);
			return 0;
		}
		while(a[1]%2==0&&b[1]%2!=0){
			if(a[1]==0&&lena==1)break;
			int x=0;
			for(re i=lena;i>=1;i--){
				int xx=a[i];
				a[i]=(x*10+a[i])/2;
				x=x*10+xx-a[i]*2;
			}
			while(lena>1&&a[lena]==0)lena--;
		}
		while(b[1]%2==0&&a[1]%2!=0){
			if(b[1]==0&&lenb==1)break;
			int x=0;
			for(re i=lenb;i>=1;i--){
				int xx=b[i];
				b[i]=(x*10+b[i])/2;
				x=x*10+xx-b[i]*2;
			}
			while(lenb>1&&b[lenb]==0)lenb--;
		}
		while(a[1]%2==0&&b[1]%2==0){
//			cout<<"dfslnhdfgh"<<endl;
			if(a[1]==0&&lena==1)break;
			if(b[1]==0&&lenb==1)break;
			int x=0;
			for(re i=lena;i>=1;i--){
				int xx=a[i];
				a[i]=(x*10+a[i])/2;
				x=x*10+xx-a[i]*2;
			}
			while(lena>1&&a[lena]==0)lena--;
			x=0;
			for(re i=lenb;i>=1;i--){
				int xx=b[i];
				b[i]=(x*10+b[i])/2;
				x=x*10+xx-b[i]*2;
			}
			while(lenb>1&&b[lenb]==0)lenb--;
			x=0;
			for(re i=1;i<=lencc;i++){
				cc[i]=cc[i]*2+x;
//				cout<<cc[i]<<" f"<<endl;
				x=cc[i]/10;
				cc[i]%=10;
			}
			while(x){
//				cout<<x<<"dfg"<<endl;
				lencc++;
				cc[lencc]=x%10;
				x/=10;
			}
		}
		if(pd()){
			lent=lena;
			for(re i=1;i<=lent;i++)t[i]=a[i];
			lena=lenb;
			for(re i=1;i<=lenb;i++)a[i]=b[i];
			lenb=lent;
			for(re i=1;i<=lent;i++)b[i]=t[i];
		}
		if(lenb==1&&b[1]==0){
			lend=lencc+lena;
			cout<<lencc<<endl;
			for(re i=1;i<=lencc;i++){
				int x=0;
				for(re j=1;j<=lena;j++){
					d[i+j-1]+=x+cc[i]*a[j];
					x=d[i+j-1]/10;
					d[i+j-1]%=10;
				}
				d[i+lena]=x;
			}
			while(lend>1&&d[lend]==0)lend--;
			for(re i=lend;i>=1;i--)printf("%d",d[i]);
			return 0;
		}
		lenc=lena;
		for(re i=1;i<=lena;i++){
			if(i>lenb)b[i]=0;
			if(a[i]<b[i]){
				a[i]+=10;
				a[i+1]--;
			}
			c[i]=a[i]-b[i];
		}
		while(lenc>1&&c[lenc]==0)lenc--;
		lena=lenb;
		for(re i=1;i<=lenb;i++)a[i]=b[i];
		lenb=lenc;
		for(re i=1;i<=lenc;i++)b[i]=c[i];
	}
	return 0;
}

已经调好久,难了大绷了,帮忙者重谢(

2023/11/8 20:27
加载中...