Description

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

Input

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

Output

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

Stein算法+高精度压位

首先不断约去A,B的公因数2直至A或B为奇数,记录约去2的次数k。

循环执行:{

 若A或B为偶数则不断约去2

 若A<B则交换A,B

 A-=B

 若A=0则输出B*2k,算法结束

}

#include<cstdio>
#include<cstring>
#define B 1000000000
const int B9=B-;
char s[];
struct num{
int a[];
int l;
num(){l=;}
inline void div2(){
for(int i=l;i>;i--){
if(a[i]&)a[i-]+=B;
a[i]>>=;
}
a[]>>=;
while(l&&!a[l])--l;
}
inline void mut2(){
for(int i=;i<=l;i++)a[i]<<=;
for(int i=;i<=l;i++)a[i+]+=a[i]/B,a[i]%=B;
if(a[l+])l++;
}
void print(){
printf("%d",a[l]);
for(int i=l-;i>=;i--)printf("%09d",a[i]);
}
}a1,b1;
inline bool operator<(num&a,num&b){
for(int i=a.l<b.l?b.l:a.l;i>=;i--){
if(a.a[i]<b.a[i])return true;
if(a.a[i]>b.a[i])return false;
}
return false;
}
inline bool operator-=(num&a,num&b){
a.a[]+=;
for(int i=a.l;i>=;i--)a.a[i]+=B9-b.a[i];
for(int i=;i<a.l;i++)a.a[i+]+=a.a[i]/B,a.a[i]%=B;
a.a[a.l]%=B;
while(a.l&&!a.a[a.l])--a.l;
}
num*a=&a1,*b=&b1,*c;
int t2=,l;
int p10[]={,,,,,,,,};
int main(){
scanf("%s",s);
l=strlen(s)-;
for(int i=;i<=l;i++)a->a[(l-i)/]+=p10[(l-i)%]*(s[i]-'');
a->l=l/;
if(a->a[a->l+])a->l++;
scanf("%s",s);
l=strlen(s)-;
for(int i=;i<=l;i++)b->a[(l-i)/]+=p10[(l-i)%]*(s[i]-'');
b->l=l/;
if(b->a[b->l+])b->l++;
while(!(a->a[]&)&&!(b->a[]&)){
t2++;
a->div2();
b->div2();
}
do{
while(!(a->a[]&))a->div2();
while(!(b->a[]&))b->div2();
if(*a<*b)c=a,a=b,b=c;
*a-=*b;
}while(a->l!=||a->a[]!=);
while(t2--)b->mut2();
b->print();
return ;
}

bzoj1876 SuperGCD的更多相关文章

  1. BZOJ-1876 SuperGCD Python(欧几里德算法)

    第一次感觉Python艹题的快感 1876: [SDOI2009]SuperGCD Time Limit: 4 Sec Memory Limit: 64 MB Submit: 2461 Solved: ...

  2. 【BZOJ1876】[SDOI2009]SuperGCD(数论,高精度)

    [BZOJ1876][SDOI2009]SuperGCD(数论,高精度) 题面 BZOJ 洛谷 题解 那些说数论只会\(gcd\)的人呢?我现在连\(gcd\)都不会,谁来教教我啊? 显然\(gcd\ ...

  3. 【bzoj1876】[SDOI2009]SuperGCD(高精度)

    题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1876 一道简单的高精度+Stein算法(或者叫辗转相除法)求最大公约数板子题. md还 ...

  4. [BZOJ1876][SDOI2009]superGCD(高精度)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1876 分析: 以为辗转相减会TLE呢……但是好像没这个数据……就这么水过去了…… 辗转 ...

  5. bzoj1876: [SDOI2009]SuperGCD

    更相减损数. 上手就debug了3个小时,直接给我看哭了. 3个函数都写错了是什么感受? 乘2函数要从前往后乘,这样后面的数乘2进位以后不会干扰前面的数. 除2函数要从后往前除,这样前面的数借来的位不 ...

  6. bzoj千题计划288:bzoj1876: [SDOI2009]SuperGCD

    http://www.lydsy.com/JudgeOnline/problem.php?id=1876 高精压位GCD 对于  GCD(a, b)  a>b 若 a 为奇数,b 为偶数,GCD ...

  7. BZOJ1876:[SDOI2009]SuperGCD——C++高精度良心题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1876 Description Sheng bill有着惊人的心算能力,甚至能用大脑计算出两个巨大的数 ...

  8. BZOJ1876 [SDOI2009]SuperGCD 【高精 + GCD优化】

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

  9. BZOJ 1876: [SDOI2009]SuperGCD

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

随机推荐

  1. Jboss7 部署EJB3 简明教程

    什么是EJB? EJB 是 Java 企业Bean, 是JavaEE服务端 企业组件模型,它的设计目标与核心应用是部署分布式应用程序.话不多说,直接看如何在本机部署EJB3.   部署环境: 操作系统 ...

  2. grafana+influxdb安装

    登录http://192.168.1.114:3000/login 2.修改完密码之后,进入主界面

  3. c++模板函数声明定义分离编译错误详解

    今天看到accelerated c++上有个简单的vector容器的实现Vec,就再vs2008上编译了下: ///// Vec.h #ifndef GUARD_VEC_H #define GUARD ...

  4. 1.1 C++布尔类型(bool)

    注意: c++ 中 cout << true << endl;  输出为 1: 布尔类型(bool)是C++新增的一种基本数据类型.在标准的C语言中并未定义bool类型,如果需 ...

  5. php and mysql 常用api函数

  6. HDU 1590 Searching(求复数向量和的极限)

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

  7. ASCII编码和Unicode编码的区别

    链接: 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了.Unicode标准也在不断发展,但最常用的是用两个字 ...

  8. HDU 1814 模板题 2-sat

    敲模板做的,不知道怎么就对了,注意一下建边即可··· 贴代码: #include<cstdio> #include<vector> using namespace std; # ...

  9. 【spring data jpa】好文储备

    [spring data jpa]带有条件的查询后分页和不带条件查询后分页实现  :  https://blog.csdn.net/lihuapiao/article/details/48782843 ...

  10. 编译libmad库

    libmad是一个开源的音频解码库,下面说说关于这个库工程的编译过程: 1.首先从网上下载libmad开源库,自己百度就能够找到关于这个库的下载链接地址,我这里提供一个: http://downloa ...