P2152 山东2009求助,玄三关
  • 板块题目总版
  • 楼主HeRuilin
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/1/22 20:11
  • 上次更新2025/1/22 22:44:22
查看原帖
P2152 山东2009求助,玄三关
1054769
HeRuilin楼主2025/1/22 20:11

原题链接

#include<bits/stdc++.h>
using namespace std;
struct bigint{
	int len,a[10005];
	bigint(){
		len=1;
		memset(a,0,sizeof a);
	}
	bigint(int c){
		len=1;
		memset(a,0,sizeof a);
		a[1]=c;
	}
	bigint(string b){
		len=b.size();
		memset(a,0,sizeof a);
		for(int i=0;i<len;i++){
			a[len-i]=b[i]-'0';
		}
	}
	int & operator [] (const int &i){
		return a[i];
	} 
	bigint & operator = (const string &b){
		len=b.size();
		memset(a,0,sizeof a);
		for(int i=0;i<b.size();i++){
			a[len-i]=b[i]-'0';
		}
		return *this; 
	}
	void shift(int L){
		len=L;
		for(int i=1;i<=L;i++){
			if(a[i]<0){
				a[i+1]--;
				a[i]+=10;
				continue; 
			}
			a[i+1]+=a[i]/10,a[i]%=10;
		}
		while(len>1&&a[len]==0)len--;
	}
	void print(){
		for(int i=max(len,1);i>=1;i--)cout<<a[i];
		cout<<endl;
	}
};
bool operator >= (bigint a,bigint b){
	if(a.len<b.len)return false;
	for(int i=a.len;i>=1;i--){
		if(a[i]!=b[i])return a[i]>b[i];
	}
	return true;
}
bool operator == (bigint a,bigint b){
	if(a.len!=b.len)return false;
	for(int i=a.len;i>=1;i--){
		if(a[i]!=b[i])return false;
	}
	return true;
}
bigint operator + (bigint a,bigint b){
	bigint c;
	c.len=max(a.len,b.len);
	for(int i=1;i<=c.len;i++){
		c[i]+=a[i]+b[i];
	}
	c.shift(c.len+1);
	return c;
}
bigint operator - (bigint a,bigint b){
	bigint c;
	c.len=max(a.len,b.len);
	for(int i=1;i<=c.len;i++){
		c[i]+=a[i]-b[i];
	}
	c.shift(c.len);
	return c;
}
bigint operator * (bigint a,bigint b){
	bigint c;
	c.len=a.len+b.len;
	for(int i=1;i<=b.len;i++){
		for(int j=1;j<=a.len;j++){
			c[i+j-1]+=a[j]*b[i];
		}
	}
	c.shift(c.len);
	return c;
}
bigint operator / (bigint a,bigint b){
	bigint c,sum;
	c.len=a.len;
	for(int i=a.len;i>=1;i--){
		sum=sum*bigint("10")+bigint(a[i]);
		while(sum>=b){
			sum=sum-b;
			c[i]++;
		}
	}
	c.shift(c.len);
	return c;
}
bigint operator >> (bigint a,int b){
	bigint c;
	c.len=a.len;
	int num=0;
	for(int i=a.len;i>=1;i--){
		if(a[i]&1){
			int now=((num*10+a[i])>>1)<<1;
			c[i]=(num*10+a[i])>>1;
			num=(num*10+a[i])-now;
		}else{
			c[i]=(num*10+a[i])>>1;
			num=0;
		}
	}
	c.shift(c.len);
	return c;
}
int main(){
	string s,t;
	cin>>s>>t;
	bigint a,b;
	a=s,b=t;
	bigint c;
	bigint d=0;
	bigint e=2;
	bigint f=1;
	while(true){
		if(a.a[1]%2==0&&b.a[1]%2==0)	a=a>>1,b=b>>1,f=f*e;
		else if(a[1]%2==0&&(b[1]&1)) a=a>>1;
		else if((a[1]&1)&&b[1]%2==0) b=b>>1;
		else {
			if(b>=a){
				c=a;
				a=b;
				b=c;
			}
			c=a-b;
			a=b;
			b=c;
		}
		if(a==d||b==d)	break;
	}
	a=a*f;
	a.print();
	return 0;
}

TLE了几个点,求帮忙改一下

悬三关

2025/1/22 20:11
加载中...