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

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

#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. 使用扩展名获取mimetype

    在Android中很多时候我们需要计算出文件的mimetype,而我们通常的思路就是通过扩展名来获取对应的mimetype,而如果自行处理,将维护一个比较大的映射表,而实际上大可不必,Android提 ...

  2. Spring 整合hibernante 错误java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener

    1.将所需的jar包全部拷贝到WEB-INF/lib下,再重新启动tomcat便能顺利通过了.参考http://blessht.iteye.com/blog/1104450 最佳答案   spring ...

  3. @Resource注解(转)

    @Resource 注解被用来激活一个命名资源(namedresource)的依赖注入,在JavaEE应用程序中,该注解被典型地转换为绑定于JNDI context中的一个对象.Spring确实支持使 ...

  4. statistics specify some columns count

    # -k1 follow the first column nr

  5. Javascript 字符串浏览器兼容问题

    先看下不兼容的写法,若我想获取某个字符串的第几位 var str='aavvvcc'; console.info(str[0]); 这种写法 在IE 7以下的浏览器都不兼容,以下提供浏览器全兼容的方式 ...

  6. byte与sbyte的转换

    C#实现byte与sbyte的转换 byte[] mByte; sbyte[] mSByte = new sbyte[mByte.Length]; ; i < mByte.Length; i++ ...

  7. 中标麒麟6.0_ICE3.4.2编译+demo测试(CPP)

    (菜鸟版)确保 gcc版本4.4.6(其他版本未测试),4.8不行 一.降级GCC到4.4.6 注意:gcc g++ c++命令都为4.4.6(可用gcc -v; g++ -v; c++ -v 命令查 ...

  8. MySQL中用decimal的原因

    原因:float保存的值有可能是这个值的近似值,而不是这个值的真实值.如 0.1在二进制中是没有办法保存真实值的. 下面是例子: 第一步:建表: create table t2(x float,y d ...

  9. 关于ODI agent的配置部署

    分类: Linux 最近,做了几个ODI项目的部署,发现ODI agent所在的位置对整个E-LT工作的影响还是比较大的,根据Oracle的官方说法,agent一般需要部署在目标端的数据库服务器上,或 ...

  10. 配件BOM定义限制(只定义配件的)

    应用 Oracle Bill Of   Materiel 层 Level Function 函数名 Funcgtion Name BOM_BOMFDBOM 表单名 Form Name BOMFDBOM ...