【题目链接】

点击打开链接

【算法】

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. 使用icomoon把svg图片生成字体图标

    今天看了使用icomoon来将svg转换成图标字体,本来是不会使用别人给的svg,也不清楚具体的好处是什么,查了svg以后,越来越懵,svg挺好的为什么要转成图标字体呢. 一.SVG介绍 SVG 是一 ...

  2. T3186 队列练习2 codevs

    http://codevs.cn/problem/3186/ 题目描述 Description (此题与队列练习1相比改了2处:1加强了数据 2不保证队空时不会出队)给定一个队列(初始为空),只有两种 ...

  3. Vim出现:_arguments:450: _vim_files: function definition file not found的问题解决

    安装了zsh之后使用vim出现如下错误: arguments:450: _vim_files: function definition file not found _arguments:450: _ ...

  4. winform客户端程序实时读写app.config文件

    新接到需求,wcf客户端程序运行时,能实时修改程序的打印机名称: 使用XmlHelper读写 winform.exe.config文件修改后始终,不能实时读取出来,查询博客园,原来已有大神解释了: 获 ...

  5. UML类间关系

    1继承 指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系:在Java中此类关系通过关键字exten ...

  6. 鼠标滚轮实现图片的缩放-------Day79

    今天是7月的最后一天了,不得不说,我定下的七月份剩余几天的计划是完不成了.一则工作确实紧了些,再则没能处理好生活.工作和学习的节奏.这才是人生最大的课题吧.只是也还好.至少自己还在坚持着.事实上真的越 ...

  7. poj 3105 Expectation 按位统计

    题意: 给n,求sum(i^j)/(n^2),0<=i,j<n.n<10^9 分析: 暴力n^2算法肯定超时.这是logn按位统计算法:按位先算出0出现的个数x,则1出现的个数为n- ...

  8. HDU 3342 Legal or Not (最短路 拓扑排序?)

    Legal or Not Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  9. python调用nmap进行扫描

    #coding=utf-8 import nmap import optparse import threading import sys import re ''' 需安装python_nmap包, ...

  10. TestNG demo

    下载TestNG的归档文件 下载最新版本的TestNG的jar文件,详细请点击访问 http://www.testng.org..在写这篇教程的时候,我下载TestNG中-6.8.jar,并将 tes ...