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

题目

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

输入格式

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

输出格式

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

输入样例

12

54

输出样例

6

题解

时隔大半年,我回来A这道题啦【当初写的太BUG了】
求GCD,很容一想到辗转相除,而高精不好操作取模,这就用到了辗转相除法的本质:更相减损法

GCD(a,b) = GCD(a,a-b) 【a >b】

然而这样会T,所以我们还要优化:

GCD(a,b) = 2*GCD(a/2,b/2) 【2|a且2|b】
GCD(a,b) = GCD(a/2,b) 【2|a】
GCD(a,b) = GCD(a,b/2) 【2|b】
GCD(a,b) = GCD(a,a-b) 【a >b】
加上个压位高精【高精减法,高精除低精,高精乘低精,高精比较】
就可以A了

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
using namespace std;
const int maxn = 10005,B = 4,Base = 10000,maxm = 100005,INF = 1000000000;
struct NUM{int s[maxn],len;NUM() {memset(s,0,sizeof(s)); len = 0;}
};
istream& operator >>(istream& in,NUM& a){string s;in>>s;int temp = 0,t = 1;for (int i = s.length() - 1; i >= 0; i--){temp = temp + t * (s[i] - '0');if (t * 10 == Base) a.s[++a.len] = temp,temp = 0,t = 1;else t *= 10;}if (temp) a.s[++a.len] = temp;return in;
}
ostream& operator <<(ostream& out,const NUM& a){if (!a.len) out<<0;else {printf("%d",a.s[a.len]);for (int i = a.len - 1; i > 0; i--) printf("%04d",a.s[i]);}return out;
}
bool check(const NUM& a){return !(a.s[1] & 1);}
bool equal(const NUM& a,const NUM& b){if (a.len != b.len) return false;REP(i,a.len) if (a.s[i] != b.s[i]) return false;return true;
}
bool operator <(const NUM& a,const NUM& b){if (a.len < b.len) return true;if (a.len > b.len) return false;for (int i = a.len; i > 0; i--){if (a.s[i] < b.s[i]) return true;if (a.s[i] > b.s[i]) return false;}return false;
}
void Half(NUM& a){int carry = 0,temp;for (int i = a.len; i > 0; i--){temp = (a.s[i] + carry * Base) / 2;carry = a.s[i] + carry * Base - temp * 2;a.s[i] = temp;}while (!a.s[a.len]) a.len--;
}
void Twice(NUM& a){int carry = 0,temp;for (int i = 1; i <= a.len; i++){temp = a.s[i] * 2 + carry;a.s[i] = temp % Base;carry = temp / Base;}while (carry) a.s[++a.len] = carry % Base,carry /= Base;
}
NUM operator -(const NUM& a,const NUM& b){NUM c; c.len = a.len;int carry = 0,temp;for (int i = 1; i <= a.len; i++){temp = a.s[i] - b.s[i] + carry;if (temp < 0) carry = -1,temp += Base;else carry = 0;c.s[i] = temp;}while (!c.s[c.len]) c.len--;return c;
}
int main(){NUM A,B; int cnt = 0;cin>>A>>B;while (!equal(A,B)){if (check(A) && check(B)) Half(A),Half(B),cnt++;else if (check(A)) Half(A);else if (check(B)) Half(B);else {if (B < A) swap(A,B);B = B - A;}}while (cnt--) Twice(A);cout<<A<<endl;return 0;
}

转载于:https://www.cnblogs.com/Mychael/p/8282745.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467051.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二叉排序树和平衡二叉排序树

二叉排序树又称为二叉查找树&#xff0c;它是一颗特殊的二叉树。&#xff08;空树&#xff09; 性质&#xff1a;1、若它的左子树非空&#xff0c;则左子树上的所有结点的值均小于根结点的值。 2、若它的右子树非空&#xff0c;则右子树上的所有结点的值均大于根结点的值。 3、…

C语言九阳神功

C语言笔记(九阳神功) 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 1.static的作用&#xff1a; &#xff08;1&#xff09;在函数体内&#xff0c;一个被声明为静态的变量在这一函数被调用过程中维持其值不变&#xff08;该变量存放在静态变量区&…

FUSE文件系统

Fuse(filesystem in userspace),是一个用户空间的文件系统。通过fuse内核模块的支持&#xff0c;开发者只需要根据fuse提供的接口实现具体的文件操作就可以实现一个文件系统。由于其主要实现代码位于用户空间中&#xff0c;而不需要重新编译内核&#xff0c;这给开发者带来了众…

myeclipse试用小记----Hibernate多对一双向关联(2)

myeclipse试用小记----Hibernate多对一双向关联&#xff08;2&#xff09;在上篇文章“myeclipse试用小记----Hibernate多对一单向关联&#xff08;1&#xff09;”中&#xff0c;讲到了“Hibernate多对一单向关联”&#xff0c;现在我打算把这个做成双向的&#xff0c;也就是多…

Python的程序结构[4] - 函数/Function[2] - 匿名函数

匿名函数 / Anonymous Function 匿名函数是一种不需要绑定函数名的函数 (i.e. functions that are not bound to a name)。匿名函数通过 lambda 表达式进行构建。常用于快速建立起一个(一次性的)函数。 Note: lambda 是 Python 的一个表达式/关键字&#xff0c;类似 return&…

数组 的地址计算

数组是一个特殊的数据结构&#xff0c;数组的基本操作不涉及数组结构的变化&#xff0c;因此对于数组而言&#xff0c;采用顺序存储表示比较合适。数组的顺序存储结构有两种&#xff1a;一、以行序存储&#xff0c;如高级语言BASIC、COBOL、Pascal、c语言。二、以列序存储&…

你会选择深圳还是佛山?

最近是校招季节&#xff0c;有很多人在询问offer的问题&#xff0c;我知道我已经发了很多这样相关的文章&#xff0c;可能大家看着都有点不耐烦了&#xff0c;不过还是想说&#xff0c;人生重要的选择真的没有几个&#xff0c;我每次回答都特别慎重&#xff0c;我有时候发出来也…

盗版XP变正版

此帖为转贴&#xff01;经本人测试100&#xff05;成功&#xff0c;谨以此帖献给各位目前不能更新的猫们&#xff0c;免得四处搜寻&#xff0c;徒劳无功&#xff01;一、经过无数次验证&#xff0c;本方法绝对有效&#xff01;敬请一试&#xff01;&#xff01;1。点击开始栏→…

区间K大数查询

给定一个序列&#xff0c;每次询问序列中第l个数到第r个数中第K大的数是哪个。输入格式第一行包含一个数n&#xff0c;表示序列长度。第二行包含n个正整数&#xff0c;表示给定的序列。第三个包含一个正整数m&#xff0c;表示询问个数。接下来m行&#xff0c;每行三个数l,r,K&a…

optimizer

在很多机器学习和深度学习的应用中&#xff0c;我们发现用的最多的优化器是 Adam&#xff0c;为什么呢&#xff1f; 下面是 TensorFlow 中的优化器&#xff0c; https://www.tensorflow.org/api_guides/python/train 在 keras 中也有 SGD&#xff0c;RMSprop&#xff0c;Adagr…

【漫画】25岁程序员 VS 35岁程序员,塑造自己的不可替代性,才能让自己更有价值 ​...

其中的酸甜苦辣你中了几条经常有人说&#xff1a;35岁是程序员的魔咒。但其实相比于刚毕业的年轻人&#xff0c;虽然35岁的程序员从精力上和年龄上都不再占有优势&#xff0c;但十几年的沉淀所造就的从容也是这个年龄段所独有的。当然&#xff0c;也不只是程序员&#xff0c;任…

C语言——内存管理

C语言——内存管理 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 //变量的存储布局&#xff08;伴随初级程序员和高级工程师一生的&#xff09; 静态区&#xff1a;全局变量和static变量&#xff0c;初始化的全局变量和静态变量放在一块区域&#xf…

WIN命令

azman.msc--授权管理器admgmt.msc--ad管理calc-----------启动计算器certmgr.msc--证书&#xff0d;当前用户certtmpl.msc--证书模板 compmgmt.msc---计算机管理conf-------启动netmeetingcys--配置您的服务器dcomcnfg.exe--组件服务dcpol.msc--域控制器策略 filesvr.msc--文件…

拦截导弹

拦截导弹 时间限制&#xff1a;3000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;3描述某国为了防御敌国的导弹袭击&#xff0c;发展中一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷&#xff1a;虽然它的第一发炮弹能够到达任意的高度&#xff0c;但是以后每一发…

C标准库

嘤嘤嘤&#xff0c;C标准库&#xff0c;我来了转载于:https://www.cnblogs.com/Fsiswo/p/8116331.html

你确定你会使用git commit?

我记得刚工作的时候&#xff0c;我第一次写git commit的内容&#xff0c;直接上来就是一个git commit -m "加上自己的注释"&#xff0c;就这样提交了。后来&#xff0c;我去了中兴&#xff0c;又去了恒大&#xff0c;接触到很多人做项目&#xff0c;发现做项目的时候…

adb devices unauthorized解决方法

有时候使用adb连接手机时&#xff0c;即使打开了usb调试&#xff0c;手机添加了信任&#xff0c;仍然出现unauthorized的提示 解决办法如下&#xff1a; 先上两张stack overflow上面的图片&#xff1a; 很多人可能看不懂。翻一下大概如下&#xff1a; 也就是在 C:\Users\xxx\.a…

可怕,别人把我MCU固件给反汇编了!

相关文章很多人都不清楚HEX文件格式CPU怎么认识代码的&#xff1f;一个超强的逆向分析软件本文主要跟大家分享一个简单逆向stm32固件程序的实例&#xff0c;为了让大家在一款成熟的产品中去考虑加密这一块的技术&#xff0c;不然分分钟被别人copy&#xff01;2、情景再现咬金&a…

GridView相关问题汇总

<asp:gridview id"gvData" runat"server" autogeneratecolumns"False"> <columns> <asp:templatefield headertext"所属系统"> <itemtemplate> <asp:label id…

带参数的宏定义

不是进行简单的字符串替换&#xff0c;还要进行参数替换。其定义的一般形式为#define 宏名(参数表) 字符串字符串中包含在括弧中所指定的参数。如&#xff1a;#define S(a,b) a*bareaS(3,2);定义矩形面积S&#xff0c;a 和 b 是边长。在程序中用了S(3,2)&#xff0c;把3、2分别…