社区讨论

TLE求条

P2152[SDOI2009] SuperGCD参与者 1已保存回复 1

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@mj56gu8p
此快照首次捕获于
2025/12/14 11:41
3 个月前
此快照最后确认于
2025/12/16 21:35
3 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
struct gj{
	string a;
	operator string()const{
        return a;
    }
    gj&operator=(const string& s){
        a=s;
        return *this;
    }
};
istream& operator>>(istream& in, gj& obj){
    in >> obj.a;
    return in;
}
ostream& operator<<(ostream& out, const gj& obj){
    out << obj.a;
    return out;
}
gj operator+ (gj x,gj y){
	string xx=x;
	string yy=y;
	if(xx.size()>yy.size()){
		string t=xx;
		xx=yy;
		yy=t;
	}
	int s=xx.size();
	int ss=yy.size();
	for(int i=0;i<s;i++){
		yy[i]+=xx[i]-'0';
		if(yy[i]>'9'){
			if(i==ss-1){
				yy+='1';
			}
			else{
				yy[i+1]++;
			}
			yy[i]-=10;
		}
	}
	for(int i=s;i<ss;i++){
		if(yy[i]>'9'){
			yy[i]-=10;
			if(i==ss-1){
				yy+='1';
			}
			else{
				yy[i+1]++;
			}
		}
	}
	return {yy};
}
gj operator- (gj x,gj y){
	string xx=x;
	string yy=y;
	string t=xx;
	xx=yy;
	yy=t;
	int s=xx.size();
	int ss=yy.size();
	for(int i=0;i<s;i++){
		yy[i]-=xx[i]-'0';
		if(yy[i]<'0'){
			yy[i+1]--;
			yy[i]+=10;
		}
	}
	for(int i=s;i<ss;i++){
		if(yy[i]<'0'){
			yy[i]+=10;
			yy[i+1]--;
		}
	}
	int sum=0;
	for(int i=ss-1;i>0;i--){
		if(yy[i]=='0'){
			sum++;
		}
		else{
			break;
		}
	}
	yy.erase(ss-sum,sum);
	return {yy};
}
gj operator* (gj x,gj y){
	vector<int> ans(string(x).size()+string(y).size());
	string xx=x;
	string yy=y;
	int s=xx.size();
	int ss=yy.size();
	for(int i=0;i<s;i++){
		for(int j=0;j<ss;j++){
			ans[i+j]+=(xx[i]-'0')*(yy[j]-'0');
		}
	}
	for(int i=0;i<s+ss;i++){
		if(ans[i]>=10){
			ans[i+1]+=ans[i]/10;
			ans[i]%=10;
		}
	}
	string anss="";
	for(int i=0;i<s+ss;i++){
		if(i==s+ss-1&&ans[i]==0){
			break;
		}
		else{
			anss+=ans[i]+'0';
		}
	}
	int sum=0;
	int nn=anss.size();
	for(int i=nn-1;i>0;i--){
		if(anss[i]=='0'){
			sum++;
		}
		else{
			break;
		}
	}
	anss.erase(nn-sum,sum);
	return {anss};
}
bool operator<=(gj x,gj y){
	string xx=x;
	string yy=y;
	if(xx.size()!=yy.size()){
		return xx.size()<yy.size();
	}
	int n=xx.size();
	for(int i=n-1;i>=0;i--){
		if(xx[i]!=yy[i]){
			return xx[i]<=yy[i];
		}
	}
	return 1;
}
bool operator<(gj x,gj y){
	string xx=x;
	string yy=y;
	if(xx.size()!=yy.size()){
		return xx.size()<yy.size();
	}
	int n=xx.size();
	for(int i=n-1;i>=0;i--){
		if(xx[i]!=yy[i]){
			return xx[i]<yy[i];
		}
	}
	return 0;
}
bool me(gj x){
	string a=x;
	if((a[0]-'0')%2==0){
		return 1;
	}
	else{
		return 0;
	}
}
gj ce(gj x){
	string a=x;
	int n=a.size();
	int y=0;
	for(int i=n-1;i>=0;i--){
		int num=a[i]-'0';
		num+=y*10;
		y=num%2;
		num/=2;
		a[i]=num+'0';
	}
	int sum=0;
	for(int i=n-1;i>0;i--){
		if(a[i]=='0'){
			sum++;
		}
		else{
			break;
		}
	}
	a.erase(n-sum,sum);
	return {a};
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	gj a,b;
	cin>>a>>b;
	gj a1={"1"};
	gj ans={"1"};
	gj t;
	string aa=a;
	string bb=b;
	reverse(aa.begin(),aa.end());
	reverse(bb.begin(),bb.end());
	a={aa};
	b={bb};
	while(me(a)&&me(b)){
		a=ce(a);
		b=ce(b);
		ans=ans+ans;
	}
	while(me(a)){
		a=ce(a);
	}
	while(me(b)){
		b=ce(b);
	}
	if(a<b){
		gj t=a;
		a=b;
		b=t;
	}
	while(1){
		a=a-b;
		while(me(a)&&a1<=a){
			a=ce(a);
		}
		if(a<b){
			gj t=a;
			a=b;
			b=t;
		}
		if(b<a1){
			break;
		}
	}
	gj anss=a*ans;
	string ansss=anss;
	reverse(ansss.begin(),ansss.end());
	cout<<ansss;
}
就是一堆重载函数+Stein算法

回复

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

正在加载回复...