[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!
致虚极,守静笃,万物并作,吾以观其复