【题目链接】

点击打开链接

【算法】

1.关于求最大公约数的算法

若使用辗转相除法,那么显然会超时

不妨这样思考 :

要求gcd(a,b),

若a为偶数,b为偶数,则gcd(a,b) = 2 * gcd(a/2,b/2)

若a为偶数,b为奇数,则gcd(a,b) = gcd(a/2,b)

若a为奇数,b为偶数,则gcd(a,b) = gcd(a,b/2)

若a为奇数,b为奇数,则gcd(a,b) = gcd(b,a-b)

这个算法的时间复杂度是log级别的

2.高精度计算

          由于a,b<=10^100,所以要用高精度

如果每一位存一个数会超时,所以我们每一位可以多位,例如9位,这样既省时间又省空间

【代码】

#include<bits/stdc++.h>
using namespace std;
#define MAXN 10000
#define MAXL 1250
const int BASE = 1e9; struct INT {
int len;
int num[MAXL+];
} A,B,ans;
int i,n; inline bool odd(INT x) {
int sta=;
while (!x.num[sta]) sta++;
return x.num[sta+x.len-] % ;
} inline bool zero(INT x) {
int i;
for (i = ; i <= MAXL; i++) {
if (x.num[i] != )
return false;
}
return true;
} inline void read(INT &x) {
int i,l,s;
char ch[MAXN];
scanf("%s",ch);
x.len = ;
l = strlen(ch);
for (i = ; i < l % ; i++) x.num[] = (x.num[] << ) + (x.num[] << ) + ch[i] - '';
if (l % != ) x.len = ;
s = ;
for (i = l % ; i < l; i++) {
if (s == ) { x.len++; s = ; }
x.num[x.len] = (x.num[x.len] << ) + (x.num[x.len] << ) + ch[i] - '';
s++;
}
x.len++;
} inline void print(INT x) {
int i,sta=;
while (!x.num[sta]) sta++;
printf("%d",x.num[sta]);
for (i = sta + ; i < sta + x.len; i++) printf("%09d",x.num[i]);
puts("");
} INT operator -= (INT &a,INT b) {
int i,sta1=,sta2=;
static INT res;
res.len = ;
memset(res.num,,sizeof(res.num));
while (!a.num[sta1]) sta1++;
while (!b.num[sta2]) sta2++;
reverse(a.num,a.num+sta1+a.len);
reverse(b.num,b.num+sta2+b.len);
for (i = ; i < max(a.len,b.len); i++) {
if (a.num[i] < b.num[i]) {
a.num[i] += BASE;
a.num[i+]--;
}
res.num[res.len++] = a.num[i] - b.num[i];
}
while (res.len > && res.num[res.len-] == ) res.len--;
reverse(res.num,res.num+res.len);
a = res;
} bool operator < (INT a,INT b) {
int i,sta1=,sta2=;
if (a.len < b.len) return true;
if (b.len < a.len) return false;
while (!a.num[sta1]) sta1++;
while (!b.num[sta2]) sta2++;
for (i = ; i < a.len; i++) {
if (a.num[sta1+i] < b.num[sta2+i]) return true;
if (b.num[sta2+i] < a.num[sta1+i]) return false;
}
return false;
} inline void multipy2(INT &x) {
int i,sta=;
while (!x.num[sta]) sta++;
reverse(x.num+sta,x.num+sta+x.len);
for (i = sta; i < sta + x.len; i++) x.num[i] = x.num[i] << ;
for (i = sta; i < sta + x.len; i++) {
if (x.num[i] >= BASE) {
x.num[i+]++;
x.num[i] %= BASE;
}
}
if (x.num[sta+x.len]) x.len++;
reverse(x.num+sta,x.num+sta+x.len);
} inline void divide2(INT &x) {
int i,n=,sta=;
static INT res;
while (!x.num[sta]) sta++;
for (i = sta; i < sta + x.len; i++) {
if (x.num[i] & ) x.num[i+] += BASE;
x.num[i] >>= ;
}
if (!x.num[sta]) x.len--;
}
int main() { read(A); read(B);
if (A < B) swap(A,B);
while (!zero(B)) {
if (odd(A) && odd(B)) A -= B;
else if (!odd(A) && odd(B)) divide2(A);
else if (odd(A) && !odd(B)) divide2(B);
else {
divide2(A);
divide2(B);
n++;
}
if (A < B) swap(A,B);
}
while (n--) multipy2(A);
print(A); return ; }

【SDOI2009】SuperGCD的更多相关文章

  1. 【BZOJ】【1876】【SDOI2009】SuperGCD

    高精度+GCD 唔……高精gcd其实可以这么算: \[ GCD(a,b)= \begin{cases} a & b=0 \\ 2*GCD(\frac{a}{2},\frac{b}{2}) &a ...

  2. 【SDOI2009】解题汇总

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

  3. 【SDOI2009】Bill的挑战

    Description Sheng bill不仅有惊人的心算能力,还可以轻松地完成各种统计.在昨天的比赛中,你凭借优秀的程序与他打成了平局,这导致Sheng bill极度的不满.于是他再次挑战你.这次 ...

  4. 【BZOJ】【1878】【SDOI2009】HH的项链

    树状数组/前缀和 Orz lct1999 好神的做法... 先看下暴力的做法:对于区间[l,r],我们依次扫过去,如果这个数是第一次出现,那么我们种类数+1. 我们发现:区间中相同的几个数,只有最左边 ...

  5. 【BZOJ】【1877】【SDOI2009】晨跑

    网络流/费用流 费用流入门题……根本就是模板题好吗! 拆点搞定度数限制,也就是每个点最多经过一次……源点汇点除外. /***************************************** ...

  6. 【bzoj1875】【SDOI2009】【HH去散步】

    1875: [SDOI2009]HH去散步 Time Limit: 20 Sec Memory Limit: 64 MB Submit: 932 Solved: 424 [Submit][Status ...

  7. BZOJ 1227 【SDOI2009】 虔诚的墓主人

    Description 小W 是一片新造公墓的管理人.公墓可以看成一块 \(N×M\) 的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地.当地的居民都是非常虔诚的基督徒,他们愿意 ...

  8. 【SDOI2009】HH的项链

    洛谷题目链接 题意: 给定一个长5w静态的序列,询问20w次,每次询问查找一个区间内的元素种类数 染色问题神烦啊,最近刚会做,感觉都可以用统一的方法 首先要算出与一个元素相同的最邻近的上一个元素的位置 ...

  9. 【SDOI2009】HH去散步(矩阵快速幂)

    题面 题目描述 HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因为HH是 ...

随机推荐

  1. 深入V8引擎-Time核心方法之mac篇

    由于底层逻辑实现不同操作系统区别很大,所以干脆分篇来说. 主要讲一下Time.TimeTicks两个类里面对于时间戳的实现,其余的运算符重载.边缘工具方法就不看了,先是Time. Time 类本身的说 ...

  2. excel转换html

    利用POI解析excel,转换成html,支持各种版本的excel.支持自定义样式.支持行列合并 需要用到的jar public class Excel2Html { /** * 读取Excel并转换 ...

  3. cocos2d-x改底层之获取UIListView的实际内容大小

    实际项目中UI界面中常常会用到UIListView.大多会在CocoStudio中直接加入这个控件. 可是在使用中发现了一些坑和功能缺乏,然后就看了一下底层的逻辑,发现略微改一下底层就能够满足需求,所 ...

  4. 【整理】nand相关

    记录nand相关知识.主要是mtd和ubi 什么是UBI 它是一种flash管理方式 flash是一系列连续的物理擦除块组成的. UBI卷是一系列连续的逻辑擦除块(eraseblock),每一块都能够 ...

  5. cocos2d-x触摸事件优先级

     CCTouchDispatcher是管理cocos2d-x中全部Touch事件派发的类, CCTouchDispatcher中包括了两个CCTouchHandler的列表, 分别存储Standa ...

  6. 不是技术牛人,如何拿到国内IT巨头的Offer--转

    http://blog.csdn.net/lsldd/article/details/13506263 不久前,byvoid面阿里星计划的面试结果截图泄漏,引起无数IT屌丝的羡慕敬仰.看看这些牛人,N ...

  7. HDU 1040 As Easy As A+B [补]

    今天去老校区找她,不想带电脑了,所以没时间A题了 /*******************************************************************/ As Ea ...

  8. Page Design for Sexable Forum

    Design Demo 1. Home of Sexable Forum 1.1  home page not logined. 1,2 home page logined. 2. Pages wit ...

  9. 光流(optical flow)和openCV中实现

    转载请注明出处! ! ! http://blog.csdn.net/zhonghuan1992 光流(optical flow)和openCV中实现 光流的概念:        是Gibson在195 ...

  10. Spring官方文档翻译——15.1 介绍Spring Web MVC框架

    Part V. The Web 文档的这一部分介绍了Spring框架对展现层的支持(尤其是基于web的展现层) Spring拥有自己的web框架--Spring Web MVC.在前两章中会有介绍. ...