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. 计数排序之python 实现源码

    old = [2, 5, 3, 0, 2, 3, 0, 3] new = [0, 0, 0, 0, 0, 0] for i in range(len(old)): new[old[i]] = new[ ...

  2. Debian vim没有颜色的解决办法

    最近在研究Linux kali 3.12-kali1-amd64  Debian 3.12.6-2kali1  x86_64 GNU/Linux Debian的内核 发现vim竟然没有颜色,root或 ...

  3. 网站开发常用jQuery插件总结(12)固定元素插件scrolltofixed

    这个插件在前段时间用过一次,当时是改一个网站.要求顶部的菜单栏随着滚动条的滚动而固定.也大体写了一下,不过在文章中也只是提了一下,文章地址:jQuery插件固定元素位置. 在这篇文章中,再进行总结一下 ...

  4. wap开发之滑动事件(swipe、tap、swipeleft、swiperight)等

    最近一直找在wap端可以实现的swipe等滑动事件的方法,开始研究了jquery-mobile,zepto,结果由于jqm太大.zepto有不少缺陷.为此研究了zepto,想把里面的swipe事件独立 ...

  5. php验证复选框有效性的示例

    本文介绍一个简单的php通过代码验证复选框值的有效性,有需要的可以参考一下 验证复选框的php代码,如下: 复制代码代码如下: <?php   /**   * 在php中验证复选框的有效性  * ...

  6. delete删除多表

    1.DELETE a.*, aa.* FROM student a, person aa WHERE a.id = aa.city_id AND a.name = '' 2.DELETE a.*, a ...

  7. django 自定义标签

    Context和RequestContext都能被Template 进行render RequestContext类接受reqest,字典,processors 实例化.并被TEMPLATE_CONT ...

  8. PCB设计之原理图绘制笔记

    02原理图工作环境设置原理图画布由画布和边界(Border)构成.可以通过DocumentOptions设置(快捷键DO).DocumentOptions设置--------------------- ...

  9. 内网DMZ外网之间的访问规则

    当规划一个拥有DMZ的网络时候,我们可以明确各个网络之间的访问关系,可以确定以下六条访问控制策略. 1.内网可以访问外网 内网的用户显然需要自由地访问外网.在这一策略中,防火墙需要进行源地址转换. 2 ...

  10. NET Portability Analyzer

    NET Portability Analyzer 分析迁移dotnet core 大多数开发人员更喜欢一次性编写好业务逻辑代码,以后再重用这些代码.与构建不同的应用以面向多个平台相比,这种方法更加容易 ...