1876: [SDOI2009]SuperGCD

Time Limit: 4 Sec  Memory Limit: 64 MB
Submit: 3060  Solved: 1036
[Submit][Status][Discuss]

Description

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

Input

共两行: 第一行:一个数A。 第二行:一个数B。

Output

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

Sample Input

12
54

Sample Output

6

HINT

对于20%的数据,0 < A , B ≤ 10 ^ 18。
对于100%的数据,0 < A , B ≤ 10 ^ 10000。

Source

[Submit][Status][Discuss]

首先普通的GCD显然是不行的,而高精度又难以进行mod运算(至少我不会写),所以我们需要一个神奇的求最大公约数的方法。

好像是在60年代,某位前辈深感欧几里得算法求GCD的不便,对其进行了改进,适合大整数(大素数)的GCD过程,而且易于理解。

首先,我们需要了解以下知识:

  1. GCD(a, b) = k * GCD(a / k, b / k) 其中,k是a和b的一个公因数。

  2. GCD(a, b) = GCD(a / k, b) 其中,k仅为a的因数,而非b的因数。

  3. GCD(a, b) = GCD(a - b, b) 其中,a大于等于b。

对于知识1和2,当k=2的时候,有:

如果a,b都是偶数,则GCD(a, b) = 2 * GCD(a / 2, b / 2)。

如果a,b中只有一个偶数,则GCD(a, b) = GCD(a / 2, b)。(假设a是偶数)

而*2和/2的运算可以通过位运算快速实现(当然,不这么做也是可以过的)。

 #include <bits/stdc++.h>

 const int siz = ;
const int mod = ; struct Int
{
int num[siz], len; inline Int(void) {
memset(num, , sizeof(num)), len = ;
} inline Int(char *s) {
int l = strlen(s);
len = (l + ) >> ;
memset(num, , sizeof(num));
for (int i = ; i < l; ++i)
(num[(l - i + ) >> ] *= ) += s[i] - ;
} inline friend bool operator < (const Int &a, const Int &b) {
if (a.len != b.len)
return a.len < b.len;
for (int i = a.len; i; --i)
if (a.num[i] != b.num[i])
return a.num[i] < b.num[i];
return false;
} inline void sub(const Int &a) {
for (int i = ; i <= a.len; ++i)
num[i] -= a.num[i];
for (int i = ; i <= len; ++i)
if (num[i] < )
num[i] += mod, --num[i + ];
while (len > && !num[len])--len;
} inline void mul2(void) {
for (int i = ; i <= len; ++i)
num[i] <<= ;
for (int i = ; i <= len; ++i)
if (num[i] >= mod)
num[i] -= mod, ++num[i + ];
while (num[len + ])++len;
} inline void div2(void) {
for (int i = len; i; --i) {
if (i > && (num[i] & ))
num[i - ] += mod;
num[i] >>= ;
}
while (len > && !num[len])--len;
} inline bool even(void) {
return !(num[] & );
} inline bool zero(void) {
return len == && !num[];
} inline void print(void) {
printf("%d", num[len]);
for (int i = len - ; i; --i)
printf("%08d", num[i]);
putchar('\n');
}
}; inline Int gcd(Int a, Int b)
{
int bit = ;
while (true)
{
if (a.zero()) {
while (bit--)b.mul2();
return b;
}
if (b.zero()) {
while (bit--)a.mul2();
return a;
}
int flag = ;
if (a.even())++flag, a.div2();
if (b.even())++flag, b.div2();
if (flag == )
++bit;
else {
if (a < b)
b.sub(a);
else
a.sub(b);
}
}
} char a[];
char b[]; signed main(void)
{
scanf("%s", a);
scanf("%s", b);
gcd(Int(a), Int(b)).print();
}

@Author: YouSiki

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

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

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

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

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

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

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

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

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

  5. bzoj 1879: [Sdoi2009]Bill的挑战

    题目链接 bzoj 1879: [Sdoi2009]Bill的挑战 题解 n<=15,装压吧 对所有字符串进行装压 可以预处理一个数组can[i][j]表示所有的字符串中,有哪些可以在第i位匹配 ...

  6. [SDOI2009][BZOJ 1876]SuperGCD

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

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

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

  8. BZOJ 1876 SuperGCD

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

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

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

随机推荐

  1. C#Excel文件加密实现,支持xlsx、docx、pptx(C#\Net\Asp.Net)

    从此刻开始,我已封闭!概不接客! 像风一样的男人,像风一样的性格,无拘无束,不拘一格.那么问题来了,当风遇到沙,不一定你是风儿,我是沙儿的缠缠绵绵,.也许是漫天黄沙,飞粒走石.如果我们期望擒住这漫天的 ...

  2. JQ的表单验证

    (function () { $("#but").click(function () { if ($("#name").val() == "" ...

  3. window7 桌面新建快捷方式方法

    点击开始按钮 所有程序 找到某个文件夹点开,找到文件夹里的快捷方式图标,右键--属性-- 复制 目标:上图蓝色内容. 回到桌面,右键--新建--快捷方式--把复制的内容粘贴到  请键入对象的位置-- ...

  4. js基础(改变透明度实现轮播图的算法)

    前面有分享过改变层级的轮播图算法,今天继续利用透明度来实现无位移的轮播图算法. 实现逻辑:将所有要轮播的图片全部定位到一起,即一层一层摞起来,并且利用层级的属性调整正确的图片顺序,将图片的透明度全部设 ...

  5. SharePoint2016合规性策略中心

    如何开启 1. 打开sp2016的管理中心,找到[应用程序]-[创建网站集],如下图: 创建完毕后,如下图: 2. 开启搜索服务并进行爬网,否则进行网站集配置的,无法搜索到网站集 打开管理中心的[管理 ...

  6. 利用私有的API获得手机上所安装的所有应用信息(包括版本,名称,bundleID,类型)

    MobileCoreService这个系统的库,里面有个私有的类LSApplicationWorkspace ,利用运行时可以获得私有类里面的方法,- (id)allInstalledApplicat ...

  7. 易企秀微场景2016最新完整版V10.5,小编亲测修复众多错误

    易企秀V10.5更新说明1.修复拨号英文错误2.修复转送场景问题3.修复设置场景密码乱码问题4.修复前台批量删除客户图片5.修复数据收集分页问题6.修复图片分类错乱问题7.修复音乐和特效冲突问题8.修 ...

  8. oracle索引监控

    目的:监控oracle索引的有效性,看索引有没有被使用.然后根据监控结果删除或者调整索引. 步骤: 1.监控指定索引 命令: alter index  索引名 monitoring usage;  如 ...

  9. SQL:执行顺序

    SELECT语句的执行的逻辑查询处理步骤: (8)SELECT (9)DISTINCT(11)<TOP_specification> <select_list>(1)FROM ...

  10. mongodb之使用explain和hint性能分析和优化

    当你第一眼看到explain和hint的时候,第一个反应就是mysql中所谓的这两个关键词,确实可以看出,这个就是在mysql中借鉴过来的,既然是借鉴 过来的,我想大家都知道这两个关键字的用处,话不多 ...