• [SDOI2009][BZOJ 1876]SuperGCD


    Description

    Sheng bill有着惊人的心算能力,甚至能用大脑计算出两个巨大的数的GCD(最大公约 数)!因此他经常和别人比
    赛计算GCD。有一天Sheng bill很嚣张地找到了你,并要求和你比 赛,但是输给Sheng bill岂不是很丢脸!所以你
    决定写一个程序来教训他。

    Input

    共两行: 第一行:一个数A。 第二行:一个数B。
    0 < A , B ≤ 10 ^ 10000。

    Output

    一行,表示A和B的最大公约数。

    题解:

      高精度

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    inline int read(){
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
        return x*f;
    }
    #define ll long long
    #define MN 1255
    #define Base 100000000
    #define Width 8
    char readin[MN*8];
    struct HPint{
        ll s[MN],len;
        void init(){memset(s,0,sizeof s);len=0;}
        HPint operator =(ll num){
            init();
            for(;num>0;){len++;s[len]=num%Base;num/=Base;}
            return *this;
        }
        HPint operator =(const char *str){
            init();
            ll numlen=strlen(str);len=(numlen+Width-1)/Width;
            for(int i=numlen-1,t=0,w;i>=0;i--,w*=10){
                if((numlen-i-1)%Width==0){w=1;t++;}
                s[t]+=w*(str[i]-48);
            }
            return *this;
        }
        bool operator <(const HPint &a)const{
            if(a.len!=len) return len<a.len;
            for(int i=a.len;i>=1;i--)if(a.s[i]!=s[i])return s[i]<a.s[i];
            return 0;
        }
        bool operator ==(const HPint &a)const{
            return !(a<*this)&&!(*this<a);
        }
        HPint operator -(const HPint &a)const{
            HPint ans;ans.init();ans.len=len;
            for(int i=1;i<=len;i++){
                ans.s[i]+=s[i]-a.s[i];
                if(ans.s[i]<0){ans.s[i]+=Base;ans.s[i+1]--;}
            }
            for(;ans.s[ans.len]==0&&ans.len>0;ans.len--);
            return ans;
        }
        void MUL2(){
            for(int i=1;i<=len;i++)s[i]*=2;len+=5;
            for(int i=1;i<=len;i++){
                s[i+1]+=s[i]/Base;
                s[i]%=Base;
            }
            for(;s[len]==0&&len>0;len--);
        }
        void DIV2(){
            len+=5;
            for(int i=len;i>=1;i--){
                if(s[i]&1)s[i-1]+=Base;
                s[i]/=2;
            }
            for(;s[len]==0&&len>0;len--);
        }
        bool check(){
            if(len==0)return 1;
            else return s[1]%2==0;
        }
        void read(){memset(readin,0,sizeof(readin));scanf("%s",readin);*this=readin;}
        void print(){
            if(len==0)printf("0");
            else{printf("%lld",s[len]);for(int i=len-1;i>=1;i--)printf("%08lld",s[i]);}
        }
    };
    HPint a,b,res;
    int cnt;
    HPint gcd(HPint x,HPint y){
        while(!(x==y)){
            if(x<y)swap(x,y);
            if(x.check()&&y.check()) x.DIV2(),y.DIV2(),cnt++;
            else if(x.check()&&!y.check()) x.DIV2();
            else if(!x.check()&&y.check()) y.DIV2();
            else if(!x.check()&&!y.check()) x=x-y;
        }
        return x;
    }
    int main(){
        a.read();b.read();
        res=gcd(a,b);
        while(cnt--) res.MUL2();
        res.print();
        return 0;
    }

      来自PaperCloud的博客,未经允许,请勿转载,TKS!

  • 相关阅读:
    安卓学习记录(四)——体温表APP
    2012ACM/ICPC亚洲区域赛成都赛区 总结
    poj 1011 Sticks(dfs+剪枝)
    uva 10891 Game of Sum (DP水题)
    poj 1077 Eight (bfs+康拓展开,A*&&IDA*算法)
    USACO Shaping Regions(离散化)
    poj 2741 Colored Cubes(dfs暴力枚举)
    LightOJ 1400 Employment (Stable Marriage)
    uva 10859 Placing Lampposts / Tree DP
    poj 1062 昂贵的聘礼(dfs+剪枝)
  • 原文地址:https://www.cnblogs.com/PaperCloud/p/9052473.html
Copyright © 2020-2023  润新知