题意简述

求两个整数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. 19.linux文件属性

    1.linux文件属性 ls -lih i查看文件inode,h查看文件大小 文件总共10个属性 inode索引节点编号(唯一的) 文件类型和权限,第一个字符为类型,后面字符为权限 硬链接的数量 文件 ...

  2. 使用Mysql执行SQL语句基础操作

    SQL:  又叫结构化语言,是一种用来操作RDBMS的数据库语言,在关系型数据库中都支持使用SQL语句,如oracle.mysql等等. 注意: 在关系型数据库中sql语句是通用的,而在非关系型数据库 ...

  3. C# Linq 笛卡尔积

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  4. Docker学习第二天-容器

    Docker 容器 容器是 Docker 又一核心概念. 简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境.对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环 ...

  5. Connecting to the Network

    This lesson shows you how to implement a simple application that connects to the network. It explain ...

  6. CSS Grid网格布局全攻略

    CSS Grid网格布局全攻略 所有奇技淫巧都只在方寸之间. 几乎从我们踏入前端开发这个领域开始,就不停地接触不同的布局技术.从常见的浮动到表格布局,再到如今大行其道的flex布局,css布局技术一直 ...

  7. request 中url拼接排序参数与签名算法

    一.参数要求: { appId:应用在后台创建应用时分配的应用编号,与应用密钥一一对应 sign:按照当前请求参数名的字母序进行升序排列(排序时区分大小写,除sign外,其它值不为空的参数都参与签名) ...

  8. python的ORM技巧记录

    # -*- coding:utf-8 -*- from sqlalchemy import create_engine, Column, Integer, String, ForeignKey, In ...

  9. [Spring-Cloud-Alibaba] Sentinel 整合RestTemplate & Feign

    Sentinel API Github : WIKI Sphu (指明要保护的资源名称) Tracer (指明调用来源,异常统计接口) ContextUtil(标示进入调用链入口) 流控规则(针对来源 ...

  10. html+css-->background-img(背景图的设置)

    背景图:(相关验证代码请查看代码,在验证时需将当前不需要验证的代码注释掉)    1.inherit:从父元素继承属性设置    2.background-repeat:平铺(在图片大小小于元素尺寸时 ...