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

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

#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. 【Android Tricks 6】ViewPager首页与尾页的滑动动作响应

    ViewPager能够说是Android应用中使用比較广发的一个组件了.它能够帮助我们非常 方便地实现滑动更换View的效果.刚好近期搞的一个项目有一个需求用到了这个,同 时是要能在首页和尾页滑动时可 ...

  2. android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu[转]

    http://blog.csdn.net/jj120522/article/details/8095852 示意图就不展示了,和上一节的一样,滑动菜单SlidingMenu效果如何大家都比较熟悉,在这 ...

  3. <memory> is not a BOMStorage file

    解决 Autoresizing 和AutoLayout 冲突 设置 self.autoresizingMask = UIViewAutoresizingNone;

  4. office中回车符的问题

    导入数据,有时直接把execl中的数据复制到数据表中,但如果有回车符时就会出错,这时可以用: Alt+1+0三个键来代表回车,直接替换掉

  5. 用PS绿化版出现“请卸载并重新安装该产品”的解决方法

    下载了一个CS6版本的绿化版PS,解压后发现用不了,因为是不用安装的,所以这个提示明显是没用的. 我把64位破解文件 amtlib.dll和32位破解文件 amtlib.dll都放进去试了一下,结果行 ...

  6. 初学springMVC搭建框架过程及碰到的问题

    刚刚开始学spring框架,因为接了一个网站的项目,想用spring+springMVC+hibernate整合来实现它,现在写下搭建框架的过程及碰到的问题.希望给自己看到也能让大家看到不要踏坑. 一 ...

  7. caret彻底的理解css的三角形【通过border】

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. js——DOM操作(二)

    表格属性: tHead:表格头 tBodies:表格正文 tFoot:表格尾 rows:行 cells:列 表单操作: <form id="form1"> <in ...

  9. Linux网络管理——端口作用

    1. 网络基础 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB",&q ...

  10. jsp 配置MySQL服务器 以及数据的插入和读取

    不多说,直接上代码.百度上面也是一大堆,大家多问百度就行. 在利用JDBC访问数据库过程中,主要涉及三种资源:对数据库的连接的连接对象Connection,SQL语句对象 Statement,访问结果 ...