1876: [SDOI2009]SuperGCD

Time Limit: 4 Sec  Memory Limit: 64 MB
Submit: 2384  Solved: 806
[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

【思路】

  除法不会写=-=

  更相减损之术:

    gcd(x,y)=2*gcd(x/2,y/2)     ---  x为偶数,y为偶数

    gcd(x,y)=gcd(x/2,y)        --- x为偶数,y为奇数

    gcd(x,y)=gcd(x,y/2)   ---x为奇数,y为偶数

    gcd(x,y)=gcd(x,x-y) (x>y) ---x为奇数,y为奇数

  高精度:压位,重载运算符写得太挫了导致各种TLE <_<,学了学别人的写法。

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; const int mx = ;
const int rad = 1e8; struct Bign {
int N[mx+];
Bign() {memset(N,,sizeof(N));}
int &operator [](int i) {return N[i];}
void operator /= (int x) {
for(int i=mx;i>=;i--)
N[i-]+=N[i]%x*rad,N[i]/=x;
}
void operator -= (Bign& B) {
for(int i=;i<mx;i++)
N[i]=N[i]-B[i]+(N[i-]+rad)/rad -,N[i-]=(N[i-]+rad)%rad;
}
Bign operator *= (int x) {
for(int i=;i<mx;i++)
N[i]=N[i]*x+N[i-]/rad,N[i-]%=rad;
}
bool operator > (Bign& B) {
for(int i=mx;i>=;i--)
if(N[i]!=B[i]) return N[i]>B[i];
return ;
}
void print() {
int p=mx;
while(!N[p]&&p>) p--;
printf("%d",N[p--]);
while(p) printf("%08d",N[p--]);
putchar('\n');
}
void read() {
char tp[]={'','','','','','','',''};
scanf("%s",tp+);
int L=strlen(tp+),p=;
while(L-*p+>)
sscanf(tp+L-*p+++,"%8d",&N[p]);
}
bool iszero() {
for(int i=;i<mx;i++) if(N[i]!=) return ;
return ;
}
}; Bign A,B; int main() {
A.read();B.read();
int g=; bool x,y;
while(!A.iszero() && !B.iszero()) {
x=!(A[]&),y=!(B[]&);
if(x && y) { g++;A/=;B/=; }
else if((x)||(y)) { if(x)A/=;else B/=; }
else{ if(A>B) A-=B; else B-=A; }
}
if(B>A) A=B;
for(int i=;i<g;i++) A*=;
A.print();
return ;
}

bzoj 1876 [SDOI2009]SuperGCD(高精度+更相减损)的更多相关文章

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

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

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

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

  3. C语言复习---获取最大公约数(辗转相除法和更相减损法)

    源自:百度百科 辗转相除法 辗转相除法:辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法. 例如,求(,): ∵ ÷=(余319) ∴(,)=(,): ∵ ÷=(余58) ∴(,)=( ...

  4. 求最大公因数(辗转相除法&更相减损术)

    求最大公因数(辗转相除法&更相减损术) 辗转相除法 又名欧几里得算法 ,其原理其实是基于这个定理:\(gcd(a,b)=gcd(b,a\%b)\),详细证明,而任何数与0的最大公约数是它本身 ...

  5. C语言,最大公约数---更相减损术

    // 最大公约数 更相减损法 int commonDivisor() { int i,k,n=0; printf("请输入两个不同的正整数,用,隔开\n"); scanf(&quo ...

  6. BZOJ 1876: [SDOI2009]SuperGCD

    1876: [SDOI2009]SuperGCD Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 3060  Solved: 1036[Submit][St ...

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

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

  8. [BZOJ1877][SDOI2009]SuperGCD

    题目大意 求两个个高精度数的gcd 题目解析 在学习gcd的时候,书上就记载了"更相减损术"这一方法 基于这种方法,我们进行优化,使得我们能快速求出两个大数的gcd 对于 \(a, ...

  9. luogu2152 [SDOI2009]SuperGCD

    要你求两个非常大的数字的GCD. 不要想复杂,用高精度整更相减损术即可. #include <cstdio> #include <cstring> #include <a ...

随机推荐

  1. IOS 学习笔记 2015-03-20 OC-集合-数组

    [NSArray] 一 定义 1 不可变数组 2 oc中数组的元素可以是任何对象 3 数字中装有元素的地址 二 初始化 NSArray *变量 = [[NSArry alloc] initWithOb ...

  2. tp_shop解读1

    由于想弄一个商城,因此研究了一下tp_shop,这个据说能完成几乎所有的功能. 考虑到原有的例子过于复杂,因此把所有相关的数据都删除了,结果上来就出错了,查了两天,大致弄清楚了状况. 关于错误的原因 ...

  3. cp 命令参数

    cp命令         该命令的功能是将给出的文件或目录拷贝到另一文件或目录中,同MSDOS下的copy命令一样,功能十分强大.         语法: cp [选项] 源文件或目录 目标文件或目录 ...

  4. SSL Programming Tutorial

    SSL Programming Tutorial � Table of Contents [ � Index       This section demonstrates the implement ...

  5. Sublime Text3 个人使用心得

    sublime与webstorm的比较: webstorm真心很强大,强大到能够几乎满足所有前端开发者编程的需求,方便的快捷键操作.代码提示.浏览器查看.工程管理.历史记录(可以找到之前编辑的内容,即 ...

  6. 青瓷qici - H5小游戏 抽奖机 4 运行脚本编写

    hello,小伙伴们,我们来继续编写相关的程序. 前几章我们已经基本把界面等问题搞定了,现在我们就来写脚本让整个流程统一起来. 看看我们现在有了什么?一个界面还有他的层次结构 青瓷界面绑定UI.js创 ...

  7. Activity的测量(Measure)、布局(Layout)和绘制(Draw)过程分析

    一个Android应用程序窗口里面包含了很多UI元素,这些UI元素是以树形结构来组织的,即它们存在着父子关系,其中,子UI元素位于父UI元素里面,因此,在绘制一个Android应用程序窗口的UI之前, ...

  8. python基础教程笔记—画幅好画(详解)

    今天写一下基础教程里面的第二个项目,主要使用python来做一个pdf的图,比较简单. 首先我们需要安装用到的模块pip install reportlab即可. 书上是用urlopen从往上下了一个 ...

  9. Objective-C中的const ,extern,static

    一.const 1>对于const,记住关键的一点,它只是修饰右边的变量. 例如: - (void)viewDidLoad { [super viewDidLoad]; // const两种用法 ...

  10. C++ 11 笔记 (二) : for循环

    首先肯定的是,我不是标题党.. C++11的for循环确实有跟C++98不一样的地方,还是先上代码: , , , , }; for (int x : test_arr) { std::cout < ...