高精度+GCD


  唔……高精gcd其实可以这么算:

\[ GCD(a,b)= \begin{cases} a & b=0 \\ 2*GCD(\frac{a}{2},\frac{b}{2}) &  a\mod 2=0,b \mod 2=0 \\ GCD(\frac{a}{2},b) &  a\mod 2=0,b \mod 2=1 \\ GCD(a,\frac{b}{2}) &  a\mod 2=1,b \mod 2=0 \\ GCD(b,a-b) & else \end{cases} \]

  然而Windows下栈空间只有8M坑爹啊……本地根本不能跑大数据。。。然后一直挂……

  只好把大部分操作都改成void类型,并且传引用,然后把gcd的过程改成对全局变量进行操作……并不传参数……

  各种乱搞一气终于是过了这道模板题……sad

 /**************************************************************
Problem: 1876
User: Tunix
Language: C++
Result: Accepted
Time:1860 ms
Memory:1556 kb
****************************************************************/ //BZOJ 1876
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
using namespace std;
typedef long long LL;
inline int getint(){
int r=,v=; char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-;
for(; isdigit(ch);ch=getchar()) v=v*-''+ch;
return r*v;
}
const int N=;
/*******************template********************/ struct bint{
int v[N];
int l;
bint(){l=; memset(v,,sizeof v);}
int& operator [] (int x){return v[x];}
}a,b,r,t; const int Limit=;
//const LL Limit=10000000000000000LL;
//1e16
void print(bint a){
printf("%d",a[a.l]);
D(i,a.l-,) printf("%09d",a[i]);
puts("");
}
bint operator - (bint a,bint b){
F(i,,a.l){
a[i]-=b[i];
if (a[i]<) a[i]+=Limit,a[i+]--;
}
while(a.l && a[a.l]==) a.l--;
return a;
}
void div2(bint& a){
F(i,,a.l){
if (a[i]&) a[i-]+=Limit/;
a[i]>>=;
}
while(a.l && a[a.l]==) a.l--;
} void mul2(bint &a){
D(i,a.l,){
a[i]<<=;
a[i+]+=a[i]/Limit;
a[i]%=Limit;
}
while (a[a.l+]>) a.l++;
}
bool operator < (bint a,bint b){
if (a.l!=b.l) return a.l<b.l;
D(i,a.l,){
if (a[i]!=b[i]) return a[i]<b[i];
}
return ;
}
void gcd(){
if (b.l==){
r=a; return;
}
if (!(a[]&) && !(b[]&)){
div2(a),div2(b); gcd(); mul2(r); return;
}
if (!(a[]&) && (b[]&)){
div2(a); gcd(); return;
}
if ((a[]&) && !(b[]&)){
div2(b); gcd(); return;
}
if (a<b) swap(a,b);
t=b; b=a-b; a=t;
gcd();
}
char s1[],s2[]; int main(){
#ifndef ONLINE_JUDGE
freopen("1876.in","r",stdin);
freopen("1876.out","w",stdout);
#endif
scanf("%s%s",s1+,s2+);
int l1=strlen(s1+),l2=strlen(s2+);
a.l=l1/+bool(l1%);
b.l=l2/+bool(l2%);
F(i,,a.l){
int k1=max(,l1-i*+),k2=l1-(i-)*;
F(j,k1,k2) a[i]=a[i]*+s1[j]-'';
}
F(i,,b.l){
int k1=max(,l2-i*+),k2=l2-(i-)*;
F(j,k1,k2) b[i]=b[i]*+s2[j]-'';
}
gcd();
print(r);
return ;
}

1876: [SDOI2009]SuperGCD

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

[Submit][Status][Discuss]

【BZOJ】【1876】【SDOI2009】SuperGCD的更多相关文章

  1. 【BZOJ 2754 喵星球上的点名】

    Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2512  Solved: 1092[Submit][Status][Discuss] Descript ...

  2. 【BZOJ】1875: [SDOI2009]HH去散步 矩阵快速幂

    [题意]给定n个点m边的无向图,求A到B恰好经过t条边的路径数,路径须满足每条边都和前一条边不同.n<=20,m<=60,t<=2^30. [算法]矩阵快速幂 [题解]将图的邻接矩阵 ...

  3. 【BZOJ】3052: [wc2013]糖果公园

    http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题意:n个带颜色的点(m种),q次询问,每次询问x到y的路径上sum{w[次数]*v[颜色]} ...

  4. 【SDOI2009】解题汇总

    又开了波专题,感觉就和炉石开冒险一样...(说的好像我有金币开冒险似的) /---------------------------------------------/ BZOJ-1226 [SDOI ...

  5. 【BZOJ】3319: 黑白树

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...

  6. 【BZOJ】3319: 黑白树(并查集+特殊的技巧/-树链剖分+线段树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后n ...

  7. 【BZOJ】【1025】【SCOI2009】游戏

    DP/整数拆分 整个映射关系可以分解成几个循环(置换群的预备知识?),那么总行数就等于各个循环长度的最小公倍数+1(因为有个第一行的1~N).那么有多少种可能的排数就等于问有多少种可能的最小公倍数. ...

  8. 【BZOJ】1013: [JSOI2008]球形空间产生器sphere

    [BZOJ]1013: [JSOI2008]球形空间产生器sphere 题意:给n+1个n维的点的坐标,要你求出一个到这n+1个点距离相等的点的坐标: 思路:高斯消元即第i个点和第i+1个点处理出一个 ...

  9. 【BZOJ】1002:轮状病毒(基尔霍夫矩阵【附公式推导】或打表)

    Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图 ...

  10. 【BZOJ】【3697】采药人的路径&【3127】【USACO2013 Open】Yin and Yang

    点分治 Orz hzwer 倒是比较好想到点分治……然而在方案统计这里,我犯了两个错误…… 1.我比较傻逼的想的是:通过儿子来更新父亲,也就是统计以x为根的子树中xxxx的路径有多少条……这样转移. ...

随机推荐

  1. Ionic Js二:背景层

    我们经常需要在 UI 上,例如在弹出框.加载框.其他弹出层中显示或隐藏背景层. 在组件中可以使用\(ionicBackdrop.retain()来显示背景层,使用\)ionicBackdrop.rel ...

  2. maven的统一版本管理实践

    为什么要使用maven的统一版本管理? 在进行项目开发的时候,我们使用maven来做项目的构建和管理.为了方便项目中各个模块之间的复用,项目通常会有多个模块构成.不同的模块,会各自应用自己需要的jar ...

  3. iOS 9应用开发教程之编辑界面与编写代码

    iOS 9应用开发教程之编辑界面与编写代码 编辑界面 在1.2.2小节中提到过编辑界面(Interface builder),编辑界面是用来设计用户界面的,单击打开Main.storyboard文件就 ...

  4. 开始一个Django项目的简单方法

    DATABASES = {     'default': {         'ENGINE': 'django.db.backends.mysql',         'NAME': '数据库名(你 ...

  5. java知识回顾

    一.构造方法能不能被继承 当然不能,1.构造方法是类的唯一入口 2.构造方法与类名相同 3.子类构造方法中隐式的调用了父类的构造方法 二.值传递和引用传递.不变类和可变类.直接赋值和浅拷贝和深拷贝   ...

  6. zoj 3157 Weapon 逆序数/树状数组

    B - Weapon Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit Sta ...

  7. Windows下Python版本的切换

    通常在Windows系统下我们可能安装了多个Python版本,那么该如何进行版本的切换呢?下面就Python2.7与Python3.0版本进行简单说明. 1.首先需要在Windows上安装Python ...

  8. EXPLAIN 用法

    重点是第二种用法,需要深入的了解. 先看一个例子: mysql> explain select * from t_order; +----+-------------+---------+--- ...

  9. Spring_Task初探(注解,XML配置)

    这几天想写一个动态添加任务项目找了找Spring下的自带定时功能发现还真有,然后网上找了找资料写了个demo 写了两种方式来执行定时的任务(XML配置和注解) 先建两个普通的任务类(XML配置调用的任 ...

  10. Bootstrap_表格

    Bootstrap 表格 Bootstrap 提供了一个清晰的创建表格的布局.下表列出了 Bootstrap 支持的一些表格元素: 标签 描述 <table> 为表格添加基础样式. < ...