更相减损,要用高精度....

---------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
 
using namespace std;
 
const int maxn = 10009;
 
char S[maxn];
int Power[maxn];
 
struct BigInt {
static const int B = 10000000;
static const int W = 7;
static const int MAXN = 10000;
int n, s[MAXN];
BigInt() {
n = 0;
memset(s, 0, sizeof s);
}
bool operator < (const BigInt &t) const {
if(n != t.n) return n < t.n;
for(int i = n; i--; )
if(s[i] != t.s[i]) return s[i] < t.s[i];
return true;
}
bool operator != (const BigInt &t) const {
return (*this < t) != (t < *this);
}
BigInt operator -= (const BigInt &t) {
for(int i = 0; i < t.n; i++) {
if(s[i] < t.s[i])
s[i] += B, s[i + 1]--;
s[i] -= t.s[i];
}
for(int i = t.n; i < n; i++) if(s[i] < 0)
s[i] += B, s[i + 1]--;
while(n > 0 && !s[n - 1]) n--;
return *this;
}
void Read() {
scanf("%s", S);
int N = strlen(S), p = N; n = N / W;
for(int i = 0; i < n; i++) {
for(int j = p - W; j < p; j++)
s[i] = s[i] * 10 + S[j] - '0';
p -= W;
}
if(N % W) {
for(int i = 0; i < p; i++)
s[n] = s[n] * 10 + S[i] - '0';
n++;
}
}
void Write() {
for(int i = n; i--; ) {
if(i != n - 1) {
int t = 0;
for(int v = s[i]; v; v /= 10) t++;
if(!t) t++;
while(t < W)
putchar('0'), t++;
}
printf("%d", s[i]);
}
putchar('\n');
}
inline bool chk() {
return n == 1 && s[0] == 1;
}
inline bool Even() {
return !(s[0] & 1);
}
void Div2() {
for(int i = n; i--; ) {
if(s[i] & 1)
s[i - 1] += B;
s[i] >>= 1;
}
if(!s[n - 1]) n--;
}
void Mul2() {
for(int i = n; i--; ) s[i] <<= 1;
for(int i = 0; i < n; i++)
if(s[i] >= B) s[i] -= B, s[i + 1]++;
if(s[n]) n++;
}
} A, B, *a = &A, *b = &B;
 
int main() {
a->Read(); b->Read();
int cnt = 0;
while(*a != *b) {
if(a->chk()) break;
if(a->Even()) {
a->Div2();
if(b->Even()) b->Div2(), cnt++;
} else if(b->Even()) {
b->Div2();
} else {
if(*b < *a) swap(b, a);
*b -= *a;
}
}
while(cnt--) a->Mul2();
a->Write();
return 0;
}

---------------------------------------------------------------

1876: [SDOI2009]SuperGCD

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

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

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

    1876: [SDOI2009]SuperGCD Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 2384  Solved: 806[Submit][Sta ...

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

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

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

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

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

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

  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. bzoj1876: [SDOI2009]SuperGCD

    更相减损数. 上手就debug了3个小时,直接给我看哭了. 3个函数都写错了是什么感受? 乘2函数要从前往后乘,这样后面的数乘2进位以后不会干扰前面的数. 除2函数要从后往前除,这样前面的数借来的位不 ...

  9. [BZOJ1877][SDOI2009]SuperGCD

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

随机推荐

  1. 共享参数ContentProvider 类与数据库绑定,如何通过共享参数测试类,测试数据库的增删改查功能

    Intent可以传一个对象 当两个界面之间跳转时,需要传递一个对象过去,是通过使用Bundle类,并且实体类需要serializable实现序列化,传递方法如下: 定义一个静态常量作为key值 pub ...

  2. VS2010中经常使用的快捷键

    1. 格式化对齐:Ctrl+K+F 2. 智能感知:Ctrl+J: 3. 智能感知显示參数信息:Ctrl+Shift+空格: 4. 检查括号匹配(在左右括号间切换): Ctrl +] 5. 选中从光标 ...

  3. Android读写JSON格式的数据之JsonWriter和JsonReader

    近期的好几个月都没有搞Android编程了,逐渐的都忘却了一些东西.近期打算找一份Android的工作,要继续拾起曾经的东西.公司月初搬家之后就一直没有网络,直到今日公司才有网络接入,各部门才開始办公 ...

  4. Oracle方向

    从毕业到现在工作已经4年了,入职前去过私企,干过外企,当前到了国企,各有各的不同,对于不同的人,有不同的适合的选择. 这几年的工作中也积累了不少知识,业务上的.技术上的,但始终觉得没有掌握一门核心,没 ...

  5. MPAndroidChart绘制图形表

    最近一个项目需要用到表格进行统计显示,本来用的是的achartengine,后来发现一个更加强大的开源框架MPAndroidChart. 下面简单介绍下MPAndroidChart,MPAndroid ...

  6. gulp简单使用小记

    npm install --save-dev 写入package.json里     var gulp = require('gulp'); var less = require('gulp-less ...

  7. Java开发常用下载的网址

    cygwin国内镜像:http://mirrors.sohu.com/cygwin/ 旧版本的ant下载:http://archive.apache.org/dist/ant/ 旧版本的nutch下载 ...

  8. [Android]Plug-in com.android.ide.eclipse.adt was unable to load class com.android.ide

    今天启动eclipse的时候报了上述错误,打开xml是都报错.其实解决方法很简单:重启eclipse即可.

  9. util 学习

    const I = 3.4893589; console.log(Number.parseInt(I)); console.log(Number.parseFloat(I)); console.log ...

  10. 好博客分享 go需要运行容器? 不需要

    http://blog.csdn.net/wsl211511/article/details/51645324 粗浅看 Tomcat中设计模式分析 http://www.infoq.com/cn/ar ...