题意简述

求两个整数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. 一篇文章学会Docker命令

    目录 简介 镜像仓库 login pull push search 本地镜像管理 images rmi tag build history save load import 容器操作 ps inspe ...

  2. MyBatis foreach标签的用法

    From<MyBatis从入门到精通> 一.foreach实现in集合 1.映射文件中添加的代码: <!-- 4.4 foreach用法 SQL语句有时会使用IN关键字,例如id i ...

  3. 【HDU - 1560】DNA sequence (dfs+回溯)

    DNA sequence 直接中文了 题目描述 21世纪是生物科技飞速发展的时代.我们都知道基因是由DNA组成的,而DNA的基本组成单位是A,C,G,T.在现代生物分子计算中,如何找到DNA之间的最长 ...

  4. 洛谷P2055 [ZJOI2009]假期的宿舍 题解

    题目链接: https://www.luogu.org/problemnew/show/P2055 分析: 这道题比较简单,二分图的练习题(当然最大流同理). 易得我们可以将人放在一侧,床放在一侧. ...

  5. 个人永久性免费-Excel催化剂功能第48波-拆分工作薄内工作表,堪称Excel界的单反

    一个工作薄有多个相同类型的工作表,然后想通过批量操作,把每个工作表都另存为一个工作薄文件,这个批量拆分工作薄,绝大多数插件都有此功能,就如懂点VBA的高级用户也常常有点不屑于用插件来完成,自己写向行V ...

  6. python黑帽子学习笔记1:pyqt5 designer+wmi实现进程监视器

    环境说明:python3.6 所需要模块:wmi.pyqt5.pythonMagick 先放上一张成品效果图,如图所示: 界面利用pyqt5的designer实现,画好界面如下图所示: 画好后,保存好 ...

  7. CentOS 下配置JDK

    从官网上下载jdk到系统中,并解压好 tar –axvf jdk.tr.gz 1. PATH环境变量.作用是指定命令搜索路径,在shell下面执行命令时,它会到PATH变量所指定的路径中查找看是否能找 ...

  8. 前端基于vue,后台采用springboot+shiro的方式搭建的一个移动端商品展示平台

    基于vue实现的移动端商品展示页,可以web-view的方式嵌入到小程序中,布局简约.大气,减少初学者或开发者不必要的工作量.后台维护采用的springboot+shiro的方式,为广大爱好者提供展示 ...

  9. java - 解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法

    通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用JVM中的栈空间: 而通过new关键字和构造器创建的对象则放在堆空间,堆是垃圾收集器管理的主要区域,由于现在的垃圾收 ...

  10. 100天搞定机器学习|Day8 逻辑回归的数学原理

    机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机器学习|D ...