zoukankan      html  css  js  c++  java
  • [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!

  • 相关阅读:
    .NetCore Grpc 客服端 工厂模式配置授权
    DOCKER 拉取 dotnet 镜像太慢 docker pull mcr.microsoft.com too slow
    Introducing .NET 5
    VSCode 出现错误 System.IO.IOException: The configured user limit (128) on the number of inotify instances has been reached.
    Omnisharp VsCode Attaching to remote processes
    zookeeper3.5.5 centos7 完全分布式 搭建随记
    Hadoop2.7.7 centos7 完全分布式 配置与问题随记
    MySQL索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序
    SQL基础随记3 范式 键
    MySQL调优 优化需要考虑哪些方面
  • 原文地址:https://www.cnblogs.com/PaperCloud/p/9052473.html
Copyright © 2011-2022 走看看