RT,T掉了最后4个点,怀疑是常数问题
#include<bits/stdc++.h>
using namespace std;
struct p
{
int x[10010]={};
int len;
} a,b,c;
char s1[10010],s2[10010];
static char buf[100000],*paa=buf,*pd=buf;
static char buf2[100000],*pp=buf2;
inline void pc(char ch){
if(pp-buf2==100000) fwrite(buf2,1,100000,stdout),pp=buf2;
*pp++=ch;
}
inline void pcc(){
fwrite(buf2,1,pp-buf2,stdout);
pp=buf2;
}
inline void print(p k)
{
for(int i=k.len-1;i>=0;i--)
{
pc(k.x[i]+48);
}
}
inline int cmp(p a,p b)
{
if(a.len<b.len) return 0;
if(a.len>b.len) return 1;
for(int i=a.len-1;i>=0;i--)
{
if(a.x[i]<b.x[i]) return 0;
if(a.x[i]>b.x[i]) return 1;
}
return 2;
}
inline p sub(p a,p b)
{
p c;
c.len=a.len;
for(int i=0;i<c.len;i++)
{
c.x[i]=a.x[i]-b.x[i];
}
for(int i=0;i<c.len;i++)
{
if(c.x[i]<0) c.x[i]+=10,c.x[i+1]--;
}
while(c.len>1&&c.x[c.len-1]==0) c.len--;
return c;
}
inline p pl(p a,p b)
{
p c;
c.len=max(a.len,b.len);
for(int i=0;i<c.len;i++)
{
c.x[i]=a.x[i]+b.x[i];
}
for(int i=0;i<c.len;i++)
{
c.x[i+1]+=(c.x[i]/10),c.x[i]%=10;
}
while(c.x[c.len])
{
c.x[c.len+1]+=c.x[c.len]/10,c.x[c.len]%=10,++c.len;
}
return c;
}
inline p c2(p a)
{
p b;
b.len=a.len;
for(int i=a.len-1;i>=0;i--)
{
b.x[i]=(a.x[i]+a.x[i+1]%2*10)/2;
}
while(b.len>1&&b.x[b.len-1]==0) b.len--;
return b;
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>s1>>s2;
a.len=strlen(s1),b.len=strlen(s2);
for(int i=0;i<a.len;i++)
{
a.x[i]=s1[a.len-i-1]-'0';
}
for(int i=0;i<b.len;i++)
{
b.x[i]=s2[b.len-i-1]-'0';
}
//print(c2(a));
int sum=0;
while(cmp(a,b)!=2)
{
if(cmp(a,b)==0) swap(a,b);
else
{
if(a.x[0]&1)
{
if(b.x[0]&1) a=sub(a,b),swap(a,b);
else b=c2(b);
}
else
{
if(b.x[0]&1) a=c2(a);
else a=c2(a),b=c2(b),++sum;
}
}
}
for(int i=1;i<=sum;i++)
{
a=pl(a,a);
}
print(a);
pcc();
}