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

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

#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. <select>标签后循环加入选项<option>——jquery

    if (data.ReplaceDataFields != null) { $.each(data.ReplaceDataFields, function (i, item) {            ...

  2. poj 2513 Colored Sticks (trie 树)

    链接:poj 2513 题意:给定一些木棒.木棒两端都涂上颜色,不同木棒相接的一边必须是 同样的颜色.求能否将木棒首尾相接.连成一条直线. 分析:能够用欧拉路的思想来解,将木棒的每一端都看成一个结点 ...

  3. java多线程(同步与死锁问题,生产者与消费者问题)

    首先我们来看同步与死锁问题: 所谓死锁,就是A拥有banana.B拥有apple. A对B说:你把apple给我.我就把banana给你. B对A说:你把banana给我,我就把apple给你. 可是 ...

  4. android的Home键的监听封装工具类(一)

    android的Home键的监听封装: package com.gzcivil.utils; import android.content.BroadcastReceiver; import andr ...

  5. EC读书笔记系列之17:条款41、42、43、44、45、46

    条款41 了解隐式接口与编译器多态 记住: ★classes和templates都支持接口和多态 ★对classes而言接口是显式的(explicit),以函数签名为中心.多态则是通过virtual函 ...

  6. .Xmodmap vim键位映射。

    remove Lock = Caps_Lockkeysym Caps_Lock = Control_Ladd Control = Control_Lkeysym Escape = grave asci ...

  7. Linux学习之进程管理

    |-进程管理     进程常用命令        |- w查看当前系统信息        |- ps进程查看命令        |- kill终止进程        |- 一个存放内存中的特殊目录/p ...

  8. phpStrom添加插件:php文档生成(phpDocumentor)

    1. 依次打开:Files => Settings => External Tools => +(add) 2. 填写信息:name:phpDoc; group:PHP插件; des ...

  9. 分析JavaScript代码应该放在HTML代码哪个位置比较好

    本文总结了多种放置JS代码的方法,需要的朋友可以参考下 在哪里放置 JavaScript 代码? 通常情况下,JavaScript 代码是和 HTML 代码一起使用的,可以将 JavaScript 代 ...

  10. xunsearch安装与卸载

    刚接触xunsearch(迅搜)的时候,我是排斥的.排斥的原因不是因为害怕学习新技术(其实我是对心技术很感兴趣),而是因为:一方面xunsearch是国人开发的,对于国人写的开源产品,我不是太感兴趣( ...