社区讨论

求优化90分TLE#10

P1932A+B A-B A*B A/B A%B Problem参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lzi53heq
此快照首次捕获于
2024/08/06 16:09
2 年前
此快照最后确认于
2024/08/06 16:50
2 年前
查看原帖
CPP
#include<cstdio>
#include<cstring>
const long long N = 1200;
const long long M = 10100;
const long long mod = 1e9;
struct BigInt{
	long long a[N];
	long long len;
	void input(char c[M]){
		long long b[M];
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		long long lenc=strlen(c);
		for(long long i=0,j=lenc;i<lenc;i++,j--){
			b[j]=c[i]-'0';
		}
		len=1;
		for(long long i=1;i<=lenc;i+=9,len++){
			if(i+8<=lenc){
				for(long long k=8;k>=0;k--){
					a[len]=a[len]*10+b[i+k];
				}
			}
			else{
				for(long long k=lenc-i;k>=0;k--){
					a[len]=a[len]*10+b[i+k];
				}
			}
		}
		len--;
	}
	void innum(long long x){
		long long b[105];
		long long blen=0;
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		if(x==0){
			len=1;
			return ;
		}
		while(x){
			b[++blen]=x%10;
			x/=10;
		}
		len=1;
		for(long long i=1;i<=blen;i+=9,len++){
			if(i+8<=blen){
				for(long long k=8;k>=0;k--){
					a[len]=a[len]*10+b[i+k];
				}
			}
			else{
				for(long long k=blen-i;k>=0;k--){
					a[len]=a[len]*10+b[i+k];
				}
			}
		}
		len--;
	}
	void print(){
		printf("%lld",a[len]);
		for(long long i=len-1;i>=1;i--){
			printf("%09lld",a[i]);
		}
	}
	BigInt operator + (const BigInt b)const{
		BigInt c;
		c.len=0;
		memset(c.a,0,sizeof(c.a));
		long long maxlen=len>b.len?len:b.len;
		for(long long i=1;i<=maxlen;i++){
			c.a[i]+=a[i]+b.a[i];
			c.a[i+1]+=c.a[i]/mod;
			c.a[i]%=mod;
		}
		c.len=maxlen;
		if(c.a[maxlen+1]!=0){
			c.len++;
		}
		return c;
	}
	BigInt operator - (const BigInt b)const{
		BigInt c;
		c.len=0;
		memset(c.a,0,sizeof(c.a));
		for(long long i=1;i<=len;i++){
			c.a[i]=a[i];
		}
		for(long long i=1;i<=len;i++){
			if(c.a[i]<b.a[i]){
				c.a[i]=c.a[i]+mod;
				c.a[i+1]--;
			}
			c.a[i]=c.a[i]-b.a[i];
		}
		c.len=len;
		while(c.a[c.len]==0 && c.len>1){
			c.len--;
		}
		return c;
	}
	BigInt operator * (const BigInt b)const{
		BigInt c;
		c.len=0;
		memset(c.a,0,sizeof(c.a));
		for(long long i=1;i<=len;i++){
			long long x=0;
			for(long long j=1;j<=b.len;j++){
				c.a[i+j-1]=a[i]*b.a[j]+x+c.a[i+j-1];
				x=c.a[i+j-1]/mod;
				c.a[i+j-1]%=mod;
			}
			c.a[i+b.len]=x;
		}
		c.len=len+b.len;
		while(c.a[c.len]==0 && c.len>1){
			c.len--;
		}
		return c;
	}
	BigInt operator / (const int b)const{
		BigInt aa;
		aa.len=0;
		memset(aa.a,0,sizeof(aa.a));
		for(long long i=1;i<=len;i++){
			aa.a[i]=a[len-i+1];
		}
		BigInt c;
		c.len=0;
		memset(c.a,0,sizeof(c.a));
		long long x=0;
		for(long long i=1;i<=len;i++){
			c.a[i]=(x*mod+aa.a[i])/b;
			x=(x*mod+aa.a[i])%b;
		}
		c.len=1;
		while(c.a[c.len]==0 && c.len<len){
			c.len++;
		}
		for(long long i=1,j=c.len;j<=len;i++,j++){
			c.a[i]=c.a[j];
		}
		c.len=len-c.len+1;
		for(long long i=1;i<=c.len/2;i++){
			long long t;
			t=c.a[i];
			c.a[i]=c.a[c.len-i+1];
			c.a[c.len-i+1]=t;
		}
		return c;
	}
	long long operator % (const int b)const{
		BigInt aa;
		aa.len=0;
		memset(aa.a,0,sizeof(aa.a));
		for(long long i=1;i<=len;i++){
			aa.a[i]=a[len-i+1];
		}
		long long x=0;
		for(long long i=1;i<=len;i++){
			x=(x*mod+aa.a[i])%b;
		}
		return x;
	}
	long long operator < (const BigInt b)const{
		if(len!=b.len)return len<b.len;
		for(long long i=len;i>=1;i--){
			if(a[i]!=b.a[i]){
				return a[i]<b.a[i];
			}
		}
		return 0;
	}
	long long operator > (const BigInt b)const{
		if(len!=b.len)return len>b.len;
		for(long long i=len;i>=1;i--){
			if(a[i]!=b.a[i]){
				return a[i]>b.a[i];
			}
		}
		return 0;
	}
};
BigInt Divide(BigInt a,BigInt b){
	BigInt aa,x,jinlv,temp,temp2;
	memset(aa.a,0,sizeof(aa.a));
	aa.len=a.len;
	for(int i=1;i<=a.len;i++){
		aa.a[i]=a.a[a.len-i+1];
	}
	BigInt c,l,r,mid,answer,k,one;
	c.len=0;
	memset(c.a,0,sizeof(c.a));
	x.innum(0);jinlv.innum(mod);one.innum(1);
	for(long long i=1;i<=a.len;i++){
		temp.innum(aa.a[i]);
		temp2=x*jinlv+temp;
		l.innum(0);
		r.innum(mod);
		answer.innum(0);
		while(l<r){
			mid=l+r+one;
			mid=mid/2;
			k=mid*b;
			if(k>temp2){
				r=mid-one;
			}
			else{
				l=mid;
				answer=mid;
			}
		}
		c.a[i]=answer.a[1];
		temp.innum(answer.a[1]);
		x=temp2-temp*b;
	}
	c.len=1;
	while(c.a[c.len]==0 && c.len<a.len){
		c.len++;
	}
	for(long long i=1,j=c.len;j<=a.len;i++,j++){
		c.a[i]=c.a[j];
	}
	c.len=a.len-c.len+1;
	for(long long i=1;i<=c.len/2;i++){
		long long t;
		t=c.a[i];
		c.a[i]=c.a[c.len-i+1];
		c.a[c.len-i+1]=t;
	}
	return c;
}
char s1[M],s2[M];
BigInt a,b,c,d;
int main(){
	scanf("%s%s",s1,s2);
	a.input(s1);b.input(s2);
	c=a+b;
	c.print();printf("\n");
	if(a>b){
		c=a-b;
		c.print();printf("\n");
	}
	else{
		c=b-a;
		printf("-");c.print();printf("\n");
	}
	c=a*b;
	c.print();printf("\n");
	c=Divide(a,b);
	c.print();printf("\n");
	d=a-b*c;
	d.print();printf("\n");
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...