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. SGU 218.Unstable Systems

    题意: 有n(n<500)台机器,和500个程序.不同的程序在不同的机器上运行有着不同的不稳定度s[i][j].求最小的最大稳定度及其方案. Solution: 比较经典的二分图模型. 建图很简 ...

  2. <s:iterator></s:iterator>循环指定输出,(status的方法使用)

    list集合中的实体的一个属性是另一个实体的集合(如下) public class PetInfo { private int petId; private String private Set< ...

  3. WebConfig加密解密

    加密:aspnet_regiis -pef appSettings "G:\FlyMusicNew\Web"解密:aspnet_regiis -pdf appSettings &q ...

  4. HDU 5619 Jam's store

    Jam's store Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  5. Python3 高级特性

    切片 L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3.即索引0,1,2,正好是3个元素. 如果第一个索引是0,还可以省略: >>> L =['Michael', ' ...

  6. 【转】ORACLE日期时间 等函数大全

    转自:ORACLE日期时间函数大全 ORACLE日期时间函数大全 TO_DATE格式(以时间:2007-11-02   13:45:25为例)           Year:              ...

  7. 商务通简单弹窗样式 V1.0

    代码为: document.writeln('<style>*{margin:0; padding:0;}</style>');//创建中间弹框    document.wri ...

  8. mysql扩展库操作mysql数据库

    环境搭建 启用mysql扩展库,在php.ini文件中去配置mysql扩展库 extension=php_mysql.dll 查询数据库 1.建库建表 //建库testcreate database ...

  9. 在后台代码中引入XAML的方法

    本文将介绍三种方法用于在后台代码中动态加载XAML,其中有两种方法是加载已存在的XAML文件,一种方法是将包含XAML代码的字符串转换为WPF的对象. 一.在资源字典中载入项目内嵌资源中的XAML文件 ...

  10. sql server 与C#数据类型对应表