社区讨论

20分TLE,已崩溃,求调(上面绿,下面有一个1.12s)

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

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@mjf3b733
此快照首次捕获于
2025/12/21 10:10
2 个月前
此快照最后确认于
2025/12/23 16:50
2 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct BigIht{
	vector<int> d;
	BigIht(){}
	BigIht(const string&s){
		for(int i=s.size()-1;i>=0;--i){
			d.push_back(s[i]-'0');
		}
	}
	BigIht(int x){
		if(x==0){
			d.push_back(0);
			return ;
		}
		while(x>0){
			d.push_back(x%10);
			x/=10;
		}
	}
	friend BigIht operator+(const BigIht& aa,const BigIht&bb){
		BigIht res;
		const vector<int>&a=aa.d;
		const vector<int>&b=bb.d;
		vector<int>& c=res.d;
		int len_a=a.size(),len_b=b.size();
		int len=max(len_a,len_b);
		c.resize(len+1,0);
		for(int i=0;i<len;++i){
			if(i<len_a)c[i]+=a[i];if(i<len_b)c[i]+=b[i];
			c[i+1]+=c[i]/10;
			c[i]%=10;
		}
		while(c.size()>1&&c.back()==0)c.pop_back();
		return res;
	}
	friend BigIht operator-(const BigIht& aa,const BigIht&bb){
		BigIht res;
		const vector<int>&a=aa.d;
		const vector<int>&b=bb.d;
		vector<int>& c=res.d;
		int len_a=a.size(),len_b=b.size();
		int len=max(len_a,len_b);
		c.resize(len+1,0);
		for(int i=0;i<len;++i){
			if(i<len_a)c[i]+=a[i];if(i<len_b)c[i]-=b[i];
			while(c[i]<0){
				c[i]+=10;
				c[i+1]--;
			}
			c[i]%=10;
		}
		while(c.size()>1&&c.back()==0)c.pop_back();
		return res;
	}
	friend BigIht operator*(const BigIht& aa,const BigIht&bb){
		BigIht res;
		const vector<int>&a=aa.d;
		const vector<int>&b=bb.d;
		vector<int>& c=res.d;
		c.resize(a.size()+b.size()+1,0);
		for(int i=0;i<a.size();++i){
			for(int j=0;j<b.size();++j){
				c[i+j]+=a[i]*b[j];
			}
		}
		for(int i=0;i<=a.size()+b.size();++i){
			if(c[i]>=10){
				c[i+1]+=c[i]/10;
				c[i]%=10;
			}
		}
		while(c.size()>1&&c.back()==0)c.pop_back();
		return res;
	}
    void div2() {
        int sum=0;
        for(int i=d.size()-1;i>=0;--i) {
            int cur=d[i]+sum*10;
            d[i]=cur/2;
            sum=cur%2;
        }
        while(d.size()>1&&d.back()==0)d.pop_back();
    }
    void cheng2(){
        int carry=0;
        for(int i=0;i<d.size();++i) {
            int p=d[i]*2+carry;
            d[i]=p%10;
            carry=p/10;
        }
        if(carry>0) {
            d.push_back(carry);
        }
    }
	friend BigIht operator/(const BigIht& aa,const int&bb){
		BigIht res;
		const vector<int>&a=aa.d;
		int sum=bb;
		vector<int>& c=res.d;
        int len_a=a.size();
		c.resize(len_a,0);
		int ans=0;
		for(int i=len_a-1;i>=0;--i){
			ans*=10;
			ans+=a[i];
			c[i]=ans/sum;
			ans%=sum;
		}
		while(c.size()>1&&c.back()==0)c.pop_back();
		return res;
	}
	friend ostream& operator<<(ostream& os,const BigIht& a){
		for(int i=a.d.size()-1;i>=0;--i)os<<a.d[i];
		return os;
	}
	friend bool operator<(const BigIht& aa,const BigIht& bb){
		const vector<int>&a=aa.d;
		const vector<int>&b=bb.d;
		if(aa.d.size()!=bb.d.size())return aa.d.size()<bb.d.size();
		for(int i=a.size()-1;i>=0;--i){
			if(a[i]!=b[i])return a[i]<b[i];
		}
		return 1;
	}
	friend bool operator>(const BigIht& aa,const BigIht& bb){
		const vector<int>&a=aa.d;
		const vector<int>&b=bb.d;
		if(aa.d.size()!=bb.d.size())return aa.d.size()>bb.d.size();
		for(int i=a.size()-1;i>=0;--i){
			if(a[i]!=b[i])return a[i]>b[i];
		}
		return 1;
	}
	friend bool operator==(const BigIht& aa,const BigIht& bb){
		const vector<int>&a=aa.d;
		const vector<int>&b=bb.d;
		return a==b;
	}
};
signed main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	string aa,bb;
	cin>>aa>>bb;
	BigIht a,b;
	BigIht k=1;
	a=aa,b=bb;
    while(a.d[0]%2==0&&b.d[0]%2==0) {
        a.div2();
        b.div2();
        k=k*2;
    }
	while(!(b==0)){ 
		if(a.d[0]%2==0&&b.d[0]%2==1){
			a.div2();
		}
		else if(a.d[0]%2==1&&b.d[0]%2==0){
			b.div2();
		}else if(a.d[0]%2==0&&b.d[0]%2==0){
			k.cheng2();
			a.div2();b.div2();
		}else{
			if(a<b){
				b=b-a;
			}else{
				BigIht t=b;
				b=a-b;
				a=t;
			}
		}
	}
	cout<<a*k;
	return 0;
} 

回复

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

正在加载回复...