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# 连接SQLServer数据库自动生成model类代码

    Program.cs using System; using System.Collections.Generic; using System.Linq; using System.Threading ...

  2. Django ORM整理

    字段类型 # 自增长 Auto = models.AutoField() BigAuto = models.BigAutoField() # 二进制 Binary = models.BinaryFie ...

  3. UCOSIII内嵌信号量

    不仅能够简化代码,而且比使用独立的信号量更有效 API函数 //等待-1 OS_SEM_CTR OSTaskSemPend (OS_TICK timeout, OS_OPT opt, CPU_TS * ...

  4. netcore里使用jwt做登陆授权

    1 什么是JWT? JWT是一种用于双方之间传递安全信息的简洁的.URL安全的表述性声明规范.JWT作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以Json对象 ...

  5. laravel——表操作集成操作

    背景:通过判断不同的请求参数,返回不同的需要的数据 一.准备工作: 数据库新建一个表 DROP TABLE IF EXISTS `tb_category2`; CREATE TABLE IF NOT ...

  6. QT--初识

    一.组成QT的基本模块 二.创建一个简单工程 1.工程结构介绍 .pro 文件 QT += core gui # 包含的模块 greaterThan(QT_MAJOR_VERSION, ): QT + ...

  7. mysql安装好需要启动和停止服务

    启动mysql: mysql.server start 停止服务:mysql.server stop

  8. python3 tkinter模块

    一.tkinter 1.tkinter--tool kit interface工具包接口,用于GUI(Graphical User Interface)用户图形界面, 2.python3.x把Tkin ...

  9. 深度学习环境搭建(CUDA9.0 + cudnn-9.0-linux-x64-v7 + tensorflow_gpu-1.8.0 + keras)

    关于计算机的硬件配置说明 推荐配置 如果您是高校学生或者高级研究人员,并且实验室或者个人资金充沛,建议您采用如下配置: 主板:X299型号或Z270型号 CPU: i7-6950X或i7-7700K ...

  10. Oracle中修改某个字段可以为空

    待修改字段假定为:shuifen 1.当该字段为空时,可直接修改: alter table reportqymx modify shuifen null; 2.当待修改字段不为空时:新增一列把要改变的 ...