1 条题解

  • 0
    @ 2025-10-8 17:04:55
    #include <bits/stdc++.h>
    using namespace std;
    const int N=1e4+10, Base=10000;
    int T;
    struct node
    {
        int len,a[N/3];
        node(){len=1;memset(a,0,sizeof(a));}
    };
     
    char s[N];
    node Init()
    {
        node no;
        scanf("%s",s+1); 
        int len=strlen(s+1);
        for(int i=1,j;i<=len;i++)
        {
            j=(len - i + 4) / 4;
            no.a[j]=no.a[j]*10+s[i]-'0';
        }
        no.len=(len+3)/4;
        return no;
    }
     
    int Cmp(node n1,node n2)
    {
        if(n1.len>n2.len) return 1;
        if(n1.len<n2.len) return -1;
        for(int i =n1.len; i>=1;i--)
        {
            if(n1.a[i]>n2.a[i]) return 1;
            if(n1.a[i]<n2.a[i]) return -1;
        }
        return 0;
    }
     
    void Chu(node &no, int x)
    {
        for(int i =no.len,t=0;i>=1;i--)
        {
            t=t*Base+no.a[i];
            no.a[i]=t/x;
            t%=x;
        }
        while(no.a[no.len]==0 && no.len>1) no.len--;
    }
     
    void jianfa(node &n1,node n2) 
    {
        for(int i=1;i<=n1.len;i++)n1.a[i]-=n2.a[i];
        for(int i=1;i<=n1.len;i++)
        { 
            if(n1.a[i]<0) 
            {
                n1.a[i]+=Base;
                n1.a[i+1]--;
            }
        }
        while(n1.a[n1.len]==0 && n1.len>1) n1.len--;
    }
     
    void Gcd(node &n1,node &n2, int &t) 
    {
        if(Cmp(n1,n2)==0) return;
         
        if(Cmp(n1,n2)<0) { Gcd(n2,n1,t);return; }
         
        int t1=0,t2=0;
        if(n1.a[1]%2==0){Chu(n1,2);t1=1;}
        if(n2.a[1]%2==0){Chu(n2,2);t2=1;}
         
        if(t1 && t2) Gcd(n1,n2, ++t);
        else if(!t1 && !t2){jianfa(n1,n2);Gcd(n1,n2,t);} 
        else Gcd(n1,n2,t);
    }
     
    void Print(node no)
    {
        printf("%d", no.a[no.len]);
        for(int i=no.len-1;i>=1;i--)printf("%04d",no.a[i]);
        printf("\n");
    }
     
    void chenfa_x(node &no, int x)
    {
        for(int i=1;i<=no.len;i++)no.a[i]*=x;
        for(int i=1;i<=no.len;i++)if(no.a[i]>Base)
        {
            no.a[i+1]+=no.a[i]/Base;
            no.a[i]%=Base;
        }
        int i=no.len;
        while(no.a[i+1]>0)
        {
            i++;
            no.a[i+1]+=no.a[i]/Base;
            no.a[i]%=Base;
        }
        no.len=i;
    }
     
    int main()
    {
        node n1=Init();
        node n2=Init();
        int T=0;Gcd(n1,n2,T);
        if(T==0)Print(n1);
        else
        {
            for(int i=1;i<=T;i++)chenfa_x(n1, 2);
            Print(n1);
        }
        return 0;
    }
    
    • 1

    信息

    ID
    3541
    时间
    1000ms
    内存
    125MiB
    难度
    7
    标签
    递交数
    45
    已通过
    11
    上传者