高精度+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. USACO 5.3 Window Area

    Window AreaIV Balkan Olympiad You've just be assigned the project of implemented a windowing interfa ...

  2. bzoj 1899 贪心+dp

    思路:这个贪心排顺序我居然没看出来. 吃饭时间长的在前面, 用反证法很容易得出. 剩下的就是瞎dp啦. #include<bits/stdc++.h> #define LL long lo ...

  3. (转)最短路算法 -- Floyd算法

    转自:http://blog.51cto.com/ahalei/1383613        暑假,小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间则没有,如下图.为了节省经费以及方便计划旅程 ...

  4. 使用DNSPod域名解析

    1 在GoDaddy域名注册商 注册域名 https://sg.godaddy.com/zh/ 2 登陆DNSPod https://www.dnspod.cn 3 选择域名解析 添加域名 4 添加记 ...

  5. Win7/Win10下搭建Go语言开发环境

    1 下载适合window版本的Go安装包,下载地址http://code.google.com/p/go/downloads/list 2 下载适合window本本的LiteIDE,下载后解压即可使用 ...

  6. Linux驱动之PCI

    <背景> PCI设备有许多地址配置的寄存器,初始化时这寄存器来配置设备的总线地址,配置好后CPU就可以访问该设备的各项资源了.(提炼:配置总线地址)   <配置寄存器>   ( ...

  7. LOJ P3960 列队 树状数组 vector

    https://www.luogu.org/problemnew/show/P3960 树状数组预处理之后直接搞就可以了,也不是很好解释,反正就是一个模拟过程的暴力用树状数组维护,还挺巧妙的. 我为什 ...

  8. Codeforces Round #295 (Div. 2)B - Two Buttons BFS

    B. Two Buttons time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  9. Caffe2(2)----Eclipse环境中使用Caffe2

    使用IDE开发深度学习的应用,可以事半功倍,Caffe2已经全面支持Python,这里介绍如何在Ubantu14.04下,利用EclipseCaffe2的二次开发或应用. 1.安装eclipse 具体 ...

  10. Linux服务器压测/拷机软件收集

    最近公司采购了一批服务器,于是收集了一些拷机软件来压测服务器硬件性能.硬件的稳定相对来说比较重要,7x24小时无间断运行,主要看三个硬件:CPU.内存.硬盘. 下面是收集的一些教程,可能网址已经失效了 ...