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. nlp-roadmap

    nlp-roadmap https://github.com/graykode/nlp-roadmap nlp-roadmap is Natural Language Processing ROADM ...

  2. mysql 设置局域网内可访问

    今天同事要连我电脑的数据库   我以为只要127.0.0.1 可以访问就是 运行通过ip访问的... 然而并不是..这里记录下方法 1.打开命令行   进入你电脑的 mysql的bin 目录下 mys ...

  3. Flume 初探

    Apache 是一个高可用.高可靠的,分布式的海量日志采集.聚合.传输系统,基于流式架构,灵活简单. Flume 最主要的作用就是实时读取服务器本地磁盘的数据,将数据写入HDFS中. Flume组成架 ...

  4. 主流WEB服务器大对比(Apache,Nginx,Lighttpd)

    一.软件介绍(apache  lighttpd  nginx) 1. lighttpd  Lighttpd 是一个具有非常低的内存开销, cpu 占用率低,效能好,以及丰富的模块等特点. lightt ...

  5. System V共享内存

    目录 1. 概述 2. System V共享内存API shmget shmat shmdt shmctl 3. 简单的程序 代码实现 common.h shmcreate.c shmrmid.c s ...

  6. python获取第前多少天的日期

    1. 显示昨天(前一天)的日期 from datetime import date, timedelta yesterday_date = (date.today() + timedelta(days ...

  7. STM32+IAR 解决Error[Pe147]: declaration is incompatible with "__nounwind __interwork __softfp unsigned

    在IAR中编译STM32工程,遇到 Error[Pe147]: declaration is incompatible with "__nounwind __interwork __soft ...

  8. 安装CDH 5.15.1详解

    安装CDH 5.15.1详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.  一.安装Cloudera Manager 和CDH 1>.登陆Cloudera Manager ...

  9. 宁波市第二届CTF部分WP之msc1,msc2

    msc1签到 这题没啥好说的,修改一下图片宽高,flag到手 msc2 一开始用十六进制编辑器打开,分析文件,暂时无果,卡了一小时(线下没网) 后面,看着这部分文件头眼熟,猜测是GIF头, 于是,在硬 ...

  10. git 如何忽略已经加入到版本控制的文件

    增加 .gitignore 文件,里面添加需要忽略的文件(file_not_wanted): 执行命令 git rm -r --cached .   注意,最后的点.不要省略. 最后重新将所有文件添加 ...