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=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
}
#define ll long long
#define MN 1255
#define Base 100000000
#define Width 8
char readin[MN*];
struct HPint{
ll s[MN],len;
void init(){memset(s,,sizeof s);len=;}
HPint operator =(ll num){
init();
for(;num>;){len++;s[len]=num%Base;num/=Base;}
return *this;
}
HPint operator =(const char *str){
init();
ll numlen=strlen(str);len=(numlen+Width-)/Width;
for(int i=numlen-,t=,w;i>=;i--,w*=){
if((numlen-i-)%Width==){w=;t++;}
s[t]+=w*(str[i]-);
}
return *this;
}
bool operator <(const HPint &a)const{
if(a.len!=len) return len<a.len;
for(int i=a.len;i>=;i--)if(a.s[i]!=s[i])return s[i]<a.s[i];
return ;
}
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=;i<=len;i++){
ans.s[i]+=s[i]-a.s[i];
if(ans.s[i]<){ans.s[i]+=Base;ans.s[i+]--;}
}
for(;ans.s[ans.len]==&&ans.len>;ans.len--);
return ans;
}
void MUL2(){
for(int i=;i<=len;i++)s[i]*=;len+=;
for(int i=;i<=len;i++){
s[i+]+=s[i]/Base;
s[i]%=Base;
}
for(;s[len]==&&len>;len--);
}
void DIV2(){
len+=;
for(int i=len;i>=;i--){
if(s[i]&)s[i-]+=Base;
s[i]/=;
}
for(;s[len]==&&len>;len--);
}
bool check(){
if(len==)return ;
else return s[]%==;
}
void read(){memset(readin,,sizeof(readin));scanf("%s",readin);*this=readin;}
void print(){
if(len==)printf("");
else{printf("%lld",s[len]);for(int i=len-;i>=;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 ;
}

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

[SDOI2009][BZOJ 1876]SuperGCD的更多相关文章

  1. BZOJ 1876 SuperGCD

    Description Sheng bill有着惊人的心算能力,甚至能用大脑计算出两个巨大的数的GCD(最大公约数)!因此他经常和别人比赛计算GCD.有一天Sheng bill很嚣张地找到了你,并要求 ...

  2. BZOJ 1876: [SDOI2009]SuperGCD

    1876: [SDOI2009]SuperGCD Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 3060  Solved: 1036[Submit][St ...

  3. bzoj 1876 [SDOI2009]SuperGCD(高精度+更相减损)

    1876: [SDOI2009]SuperGCD Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 2384  Solved: 806[Submit][Sta ...

  4. BZOJ 1876: [SDOI2009]SuperGCD( 更相减损 + 高精度 )

    更相减损,要用高精度.... --------------------------------------------------------------- #include<cstdio> ...

  5. BZOJ 1876 [SDOI2009] SuperGcd | PY好题

    题面就是让你求两个超级大整数,求GCD 题解: 题目本意应该是出题人想考考高精度取膜 但是可以通过一种神奇的Stein算法来做 由J. Stein 1961年提出的Stein算法很好的解决了欧几里德算 ...

  6. 「BZOJ 1876」「SDOI 2009」SuperGCD「数论」

    题意 求\(\gcd(a, b)\),其中\(a,b\leq10^{10000}\) 题解 使用\(\text{Stein}\)算法,其原理是不断筛除因子\(2\)然后使用更相减损法 如果不筛\(2\ ...

  7. bzoj 1876

    传送门 http://www.lydsy.com/JudgeOnline/problem.php?id=1876 二进制gcd 学到了(' '      ) 高精还得压位,最开始没写压位,然后调了1h ...

  8. bzoj 1876 高精

    首先我们知道,对于两个数a,b,他们的gcd情况有如下形式的讨论 当a为奇数,b为偶数的时候gcd(a,b)=gcd(a div 2,b) 当b为奇数,a为偶数的时候gcd(a,b)=gcd(a,b ...

  9. [SDOI2009][BZOJ 1226]学校食堂

    Description 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人的口味都可以 ...

随机推荐

  1. C# vb实现浮雕特效滤镜效果

    在.net中,如何简单快捷地实现Photoshop滤镜组中的浮雕效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第一步 ...

  2. Linux定时清理日志脚本

    在应用疯狂打日志的情况下,服务器很容易被塞满磁盘. 先要写一个shell脚本,脚本如下. #!/bin/bash #----------------使用规范---------------- #1.该文 ...

  3. TCP 为什么需要三次握手而不是两次

    我的理解: A 发送给B SYN, 然后B回复A ACK,  假设这两次握手已经完成,  但是B不知道A是否收到ACK就开始  recv  , 这样就是空等  算是死循环吧??

  4. css设置图片百分比显示,最简洁的代码

    css代码: .img-box { padding-bottom: 100%; } .img-box img { position: absolute; top:; bottom:; left:; r ...

  5. MySQL DataType--当整数列遇到小数

    初始化数据: ## 创建测试表 CREATE TABLE `tb002` ( `c1` ) NOT NULL AUTO_INCREMENT, `c2` ) DEFAULT NULL, `c3` ) D ...

  6. 【JUC】5.线程池—Executor

    创建线程池可以分为三种方式: 1. 通过ThreadPoolExecutor的构造方法,创建ThreadPoolExecutor的对象,即一个线程池对象: 此构造方法,一共7个参数,5个必须参数,2个 ...

  7. p2.BTC-数据结构

    hash pointers:哈希指针,除了保存值的地址,还要存这整个区块的内容的hash值.这样就既能访问到值,还能确定访问的值有没有被篡改. 一 Blockchain Block chain is ...

  8. ubuntu---对比工具Meld

    Beyond Compare是商业软件,下载地址:http://www.scootersoftware.com/download.php.下载完直接运行或者通过dpkg安装即可. 其实Linux下文本 ...

  9. 剑指offer:二维数组的查找

    题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...

  10. Codeforces H. Maximal GCD(贪心)

    题目描述: H. Maximal GCD time limit per test 1 second memory limit per test 256 megabytes input standard ...