MLE 20pts 求调
查看原帖
MLE 20pts 求调
593635
jsd2718楼主2024/11/24 19:04

P2152 [SDOI2009] SuperGCD

#include<bits/stdc++.h>
using namespace std;
string x,y;
bool jw,jww;
string bq(string s,int len)
{
	while(s.length()<len)
	{
		s.insert(0,"0");
	}
	return s;
}
string mul(string s)
{
	jw=0;
	for(int i=s.length()-1;i>=0;i--)
	{
		if((s[i]-'0')*2>=10)
		{
			if(i==0)
			{
				s.insert(0," ");
				s[0]='1';
				if(jw)s[1]=(s[1]-'0')*2-9+'0';
				else s[1]=(s[1]-'0')*2-10+'0';
			}
			else
			{
				if(jw)s[i]=(s[i]-'0')*2-9+'0';
				else s[i]=(s[i]-'0')*2-10+'0';
				jw=1;	
			}
		}
		else
		{
			if(jw)s[i]=(s[i]-'0')*2+1+'0';
			else s[i]=(s[i]-'0')*2+'0';
			jw=0;
		}
	}
	return s;
}
string div(string s)
{
	jw=0;
	for(int i=0;i<s.length();i++)
	{
		if((s[i]-'0')%2==1)jww=1;
		else jww=0;
		if(jw)s[i]=(s[i]-'0'+10)/2+'0';
		else s[i]=(s[i]-'0')/2+'0';
		if(i==0&&s[i]=='0')
		{
			s.erase(0,1);
			i--;
		}
		jw=jww;
	}
	return s;
}
string mis(string x,string y)
{
	y=bq(y,x.length());
	for(int i=x.length()-1;i>=0;i--)
	{
		if(x[i]<y[i])
		{
			x[i-1]--;
			x[i]='9'+1+x[i]-y[i];
		}
		else x[i]=x[i]-y[i]+'0';
	}
	while(x[0]=='0')
	{
		x.erase(0,1);
	}
	return x;
}
string gcd(string a,string b)
{
	if(a.length()<b.length()||(a.length()==b.length()&&a<b))swap(a,b);
	if(a==b||b=="0")return a;
	if((a[a.length()-1]-'0')%2==0&&(b[b.length()-1]-'0')%2==0)return mul(gcd(div(a),div(b)));
	else if((a[a.length()-1]-'0')%2==0)return gcd(div(a),b);
	else if((b[b.length()-1]-'0')%2==0)return gcd(a,div(b));
	else return gcd(mis(a,b),b);
}
int main()
{
	cin>>x>>y;
	cout<<gcd(x,y);
	return 0;
}

MLE 20pts

急求orz

2024/11/24 19:04
加载中...