题意简述

求两个整数a,b的最大公约数0 < a , b ≤ 10 ^ 10000。

题解思路

如果 a % 2 == 0 && b % 2 == 0 gcd(a,b) = gcd(a / 2, b / 2) * 2

如果 a % 2 == 0 && b % 2 != 0 gcd(a,b) = gcd(a / 2, b);

如果 a % 2 != 0 && b % 2 == 0 gcd(a,b) = gcd(a, b / 2);

如果 a % 2 != 0 && b % 2 != 0 gcd(a,b) = gcd(a - b, b);

代码

#include <cstring>
#include <iostream>
using namespace std;
struct Number
{
int a[100000];
int c;
Number& operator=(const Number& rhs)
{
c = rhs.c;
for (register int i = 1; i <= c; ++i)
a[i] = rhs.a[i];
return *this;
}
}n1, n2, ans, xx;
char st[100000];
bool b1, b2;
void print(const Number &x)
{
if (!x.c) {cout << 0 << endl; return;}
for (register int i = x.c + 1; --i; ) cout << x.a[i];
cout << endl;
}
bool compare(const Number &x, const Number &y)
{
if (x.c != y.c) return x.c < y.c;
for (register int i = x.c + 1; --i; )
if (x.a[i] != y.a[i])
return x.a[i] < y.a[i];
return 0;
}
void _swap(Number &x, Number &y)
{
Number t;
t = x; x = y; y = t;
}
void div(Number &x)
{
if (x.a[x.c] == 1) x.a[x.c] = 0, x.a[--x.c] += 10;
for (register int i = x.c; i; --i)
if (x.a[i] & 1)
{
x.a[i] /= 2;
x.a[i - 1] += 10;
}
else x.a[i] /= 2;
}
void mul(Number &x, const Number &y)
{
Number c;
memset(c.a, 0, sizeof c.a);
c.c = x.c + y.c - 1;
for (register int i = 1; i <= x.c; ++i)
for (register int j = 1; j <= y.c; ++j)
{
c.a[i + j - 1] += x.a[i] * y.a[j];
c.a[i + j] += c.a[i + j - 1] / 10;
c.a[i + j - 1] %= 10;
}
while (c.a[c.c + 1]) ++c.c;
_swap(c, x);
}
void sub(Number &x, const Number &y)
{
for (register int i = 1; i <= y.c; ++i)
{
x.a[i] -= y.a[i];
if (x.a[i] < 0)
{
x.a[i] += 10;
x.a[i + 1] -= 1;
}
}
int xx = y.c + 1;
while (x.a[xx] < 0) x.a[xx] += 10, x.a[++xx] -= 1;
while (!x.a[x.c] && x.c > 0) --x.c;
}
int main()
{
ans.a[++ans.c] = 1;
xx.a[++xx.c] = 2;
ios::sync_with_stdio(0);
cin >> st;
n1.c = strlen(st);
for (register int i = n1.c; i; --i)
n1.a[i] = st[n1.c - i] - '0';
cin >> st;
n2.c = strlen(st);
for (register int i = n2.c; i; --i)
n2.a[i] = st[n2.c - i] - '0';
if (compare(n1, n2)) _swap(n1, n2);
while (n2.c)
{
while (!(n1.a[1] & 1) && !(n2.a[1] & 1))
{
mul(ans, xx);
div(n1);
div(n2);
}
if (!(n1.a[1] & 1)) div(n1);
else if (!(n2.a[1] & 1)) div(n2);
else sub(n1, n2);
if (compare(n1, n2)) _swap(n1, n2);
}
mul(ans, n1);
print(ans);
}

洛谷 P2152 [SDOI2009]SuperGCD的更多相关文章

  1. 洛谷 P2152 [SDOI2009]SuperGCD (高精度)

    这道题直接写了我两个多小时-- 主要是写高精度的时候还存在着一些小毛病,调了很久 在输入这一块卡了很久. 然后注意这里用while的形式写,不然会炸 最后即使我已经是用的万进制了,但是交上去还是有两个 ...

  2. 洛谷 2152 [SDOI2009]SuperGCD

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

  3. 洛谷P1972 [SDOI2009]HH的项链 题解

    [SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不 ...

  4. BZOJ1880或洛谷2149 [SDOI2009]Elaxia的路线

    BZOJ原题链接 洛谷原题链接 显然最长公共路径是最短路上的一条链. 我们可以把最短路经过的边看成有向边,那么组成的图就是一张\(DAG\),这样题目要求的即是两张\(DAG\)重合部分中的最长链. ...

  5. 洛谷P2148 [SDOI2009]E&D(博弈论)

    洛谷题目传送门 先安利蒟蒻仍在施工的博弈论总结 首先根据题目,石子被两两分组了,于是根据SG定理,我们只要求出每一组的SG值再全部异或起来就好啦. 把每一对数看成一个ICG,首先,我们尝试构造游戏的状 ...

  6. BZOJ1227或洛谷2154 [SDOI2009]虔诚的墓主人

    BZOJ原题链接 洛谷原题链接 又是扫描线,题解可看大佬的博客(太懒了不想打) #include<cstdio> #include<algorithm> using names ...

  7. BZOJ1228或洛谷2148 [SDOI2009]E&D

    BZOJ原题链接 洛谷原题链接 完全不会呀.. 写了这题才知道\(SG\)函数原来也能打表找规律... 题解请看大佬的博客 #include<cstdio> using namespace ...

  8. BZOJ1226或洛谷2157 [SDOI2009]学校食堂

    BZOJ原题链接 洛谷原题链接 注意到\(B[i]\)很小,考虑状压\(DP\). 设\(f[i][j][k]\)表示前\(i - 1\)个人已经拿到菜,第\(i\)个人及其后面\(7\)个人是否拿到 ...

  9. [洛谷P1972][SDOI2009]HH的项链

    题目大意:给你一串数字,多次询问区间内数字的种类数 题解:莫队 卡点:洛谷数据加强,开了个$O(2)$ C++ Code: #include <cstdio> #include <a ...

随机推荐

  1. 好用的在线画图工具processon

    ProcessOn是一款基于SaaS的前沿.高效线上作图工具,它将Visio.Xmind等专业作图工具搬到了"云端" 注册链接:https://www.processon.com/ ...

  2. QRowTable表格控件(二)-红涨绿跌

    目录 一.开心一刻 二.概述 三.效果展示 四.任务需求 五.指定列排序 六.排序 七.列对其方式 八.相关文章 原文链接:QRowTable表格控件(二)-红涨绿跌 一.开心一刻 一天,五娃和六娃去 ...

  3. Oracle使用MyBatis中RowBounds实现分页查询

    Oracle中分页查询因为存在伪列rownum,sql语句写起来较为复杂,现在介绍一种通过使用MyBatis中的RowBounds进行分页查询,非常方便. 使用MyBatis中的RowBounds进行 ...

  4. JAVA AES文件加解密

    AES加解密算法,代码如下: /** * Created by hua on 2017/6/30. */ import javax.crypto.Cipher; import javax.crypto ...

  5. Web前端三大框架_vue源码笔记

    一.VUE 1.1 MVVM VUE也是基于MVVM模式实现的.特点就是数据双向绑定 在MVVM模式中,分成三个部分: M 模型 model V 视图 view VM 视图-模型 view-model ...

  6. vs2005 打不开resoure view?

    原来是破解版 vc助手惹的祸. 解决方法:卸载vc助手或者换一个注册的vc助手

  7. 洛谷P4304 [TJOI2013]攻击装置 题解

    题目链接: https://www.luogu.org/problemnew/show/P4304 分析: 最大独立集 最大独立集=总点数-最大匹配数 独立集:点集,图中选一堆点,这堆点两两之间没有连 ...

  8. 个人永久性免费-Excel催化剂功能第54波-批量图片导出,调整大小等

    图片作为一种数据存在,较一般的存放在Excel单元格或其他形式存在的文本数据,对其管理更为不易,特别是仅有Excel原生的简单的插入图片功能时,Excel催化剂已全面覆盖图片数据的使用场景,无论是图片 ...

  9. OWASP 关于会话管理 - 译文 [原创]

    英文原文:https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Session_Management_Cheat_Shee ...

  10. Sqoop学习及使用

    Sqoop 简介 Sql + Hadoop = Sqoop Apache Sqoop™是一种旨在有效地在 Apache Hadoop 和诸如关系数据库等结构化数据存 储之间传输大量数据的工具 原理 将 ...