求卡常!!!
查看原帖
求卡常!!!
1636464
my_dream666楼主2025/8/4 15:04

差 40 ms,急! 已高精压位,部分用了二进制

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct high_precision
{
	int len;
	int num[10010];
	bool operator < (const high_precision b) const
	{
		if(this->len!=b.len) return this->len<b.len;
		for(int i=len;i>=1;i--)
		{
			if(this->num[i]!=b.num[i]) return this->num[i]<b.num[i];
		}
		return false;
	}
	high_precision operator / (int b)  //b实际上只是摆设,用 2直接运算即可 
	{
		high_precision a=*this;
		for(int i=len;i>=1;i--)
		{
			a.num[i-1]+=(a.num[i]&1)*100;  //b必定为 2; 
			a.num[i]>>=1;
		}
		while(a.num[a.len]==0&&a.len>0) a.len--;
		return a;
	}
	high_precision operator * (int b)  //同除法 
	{
		high_precision a=*this;
		for(int i=1;i<=len;i++) a.num[i]<<=1;
		for(int i=1;i<=len;i++)
		{
			a.num[i+1]+=a.num[i]/100;
			a.num[i]%=100;
			if(i==a.len&&a.num[i+1]>0) a.len++;
		}
		return a;
	}
	high_precision operator - (const high_precision b)
	{
		high_precision a=*this; 
		for(int i=1;i<=a.len;i++)
		{
			if(a.num[i]<b.num[i])
			{
				a.num[i]+=100;
				a.num[i+1]--;
			}
			a.num[i]-=b.num[i];
		}
		while(a.num[a.len]==0&&a.len>0) a.len--;
		return a;
	}
	void print()
	{
		printf("%d",this->num[this->len]);
		for(int i=this->len-1;i>=1;i--) printf("%02d",this->num[i]);
		if(this->len==0) printf("0");
		puts("");
	}
}a1,a2;
char s1[10010],s2[10010];
high_precision gcd(high_precision x,high_precision y)
{
	high_precision temp;
	int cnt=0;
	while(y.len)
	{
		if(!(x.num[1]&1)&&!(y.num[1]&1)) cnt++;
		if(!(x.num[1]&1)) x=x/2;
		if(!(y.num[1]&1)) y=y/2;
		if(x<y) swap(x,y);
		temp=x;
		x=y;
		y=temp-y;
		if(x<y) swap(x,y);
	}
	for(int i=1;i<=cnt;i+=2) x=x*2;
	return x;
}
int main()
{
	int len1,len2;
	scanf("%s%s",s1+1,s2+1);
	len1=strlen(s1+1);
	len2=strlen(s2+1);
	reverse(s1+1,s1+1+len1);
	reverse(s2+1,s2+1+len2);
	if(len1&1)
	{
		len1++;
		s1[len1]='0';
	}
	if(len2&1)
	{
		len2++;
		s2[len2]='0';
	}
	a1.len=len1/2;
	a2.len=len2/2;
	for(int i=1;i<=len1;i++)
	{
		a1.num[i+1>>1]=s1[i]-'0';
		i++;
		a1.num[i>>1]+=(s1[i]-'0')*10;
	}
	for(int i=1;i<=len2;i++)
	{
		a2.num[i+1>>1]=s2[i]-'0';
		i++;
		a2.num[i>>1]+=(s2[i]-'0')*10;
	}
	high_precision ans=gcd(a1,a2);
	ans.print();
	return 0;
}
2025/8/4 15:04
加载中...