【SDOI2009】SuperGCD
【题目链接】
【算法】
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的更多相关文章
- 【BZOJ】【1876】【SDOI2009】SuperGCD
高精度+GCD 唔……高精gcd其实可以这么算: \[ GCD(a,b)= \begin{cases} a & b=0 \\ 2*GCD(\frac{a}{2},\frac{b}{2}) &a ...
- 【SDOI2009】解题汇总
又开了波专题,感觉就和炉石开冒险一样...(说的好像我有金币开冒险似的) /---------------------------------------------/ BZOJ-1226 [SDOI ...
- 【SDOI2009】Bill的挑战
Description Sheng bill不仅有惊人的心算能力,还可以轻松地完成各种统计.在昨天的比赛中,你凭借优秀的程序与他打成了平局,这导致Sheng bill极度的不满.于是他再次挑战你.这次 ...
- 【BZOJ】【1878】【SDOI2009】HH的项链
树状数组/前缀和 Orz lct1999 好神的做法... 先看下暴力的做法:对于区间[l,r],我们依次扫过去,如果这个数是第一次出现,那么我们种类数+1. 我们发现:区间中相同的几个数,只有最左边 ...
- 【BZOJ】【1877】【SDOI2009】晨跑
网络流/费用流 费用流入门题……根本就是模板题好吗! 拆点搞定度数限制,也就是每个点最多经过一次……源点汇点除外. /***************************************** ...
- 【bzoj1875】【SDOI2009】【HH去散步】
1875: [SDOI2009]HH去散步 Time Limit: 20 Sec Memory Limit: 64 MB Submit: 932 Solved: 424 [Submit][Status ...
- BZOJ 1227 【SDOI2009】 虔诚的墓主人
Description 小W 是一片新造公墓的管理人.公墓可以看成一块 \(N×M\) 的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地.当地的居民都是非常虔诚的基督徒,他们愿意 ...
- 【SDOI2009】HH的项链
洛谷题目链接 题意: 给定一个长5w静态的序列,询问20w次,每次询问查找一个区间内的元素种类数 染色问题神烦啊,最近刚会做,感觉都可以用统一的方法 首先要算出与一个元素相同的最邻近的上一个元素的位置 ...
- 【SDOI2009】HH去散步(矩阵快速幂)
题面 题目描述 HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因为HH是 ...
随机推荐
- android Containers控件
1.RadioGroup 一组单选框容器 2.ListView 3.GridView 4.ExpandableListView 可折叠列表 5.ScrollView 上下滚动条 6.Horizonta ...
- 浅谈云网融合与SD-WAN
一.引言 近年来,SD-WAN作为一项新技术在行业应用领域里快速发展,企业对SD-WAN的接受度日渐提升,各厂商也纷纷提出解决方案.随着全球云计算领域的活跃创新和我国云计算发展进入应用普及阶段,越来越 ...
- BZOJ——1614: [Usaco2007 Jan]Telephone Lines架设电话线
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1930 Solved: 823[Submit][Status][Discuss] Description ...
- 关于android分享(sharedsdk的简单使用)
老早就使用了.可是如今才写,惰性太大,如今改 如今做产品的话相信大家基本都做分享吧.一个是项目的需求须要,另一个是能够非常好的宣传自己的产品.其它的优点依据情况而论 事实上每一个平台都有它自己的文档, ...
- poj 1694 An Old Stone Game 树形dp
//poj 1694 //sep9 #include <iostream> #include <algorithm> using namespace std; const in ...
- JavaSE Map的使用
1.Map概述 Map与Collection并列存在.用来保存具有映射关系的数据:Key-Value Map 中的 key 和 value都能够是不论什么引用类型的数据 Map 中的 key 用Se ...
- RecyclerView的万能切割线
效果图: 用法: 加入默认切割线:高度为2px.颜色为灰色 mRecyclerView.addItemDecoration(new RecycleViewDivider(mContext, Linea ...
- 删除DataGridView选中行并更新数据库
前面写过一篇文章是DataGridView控件显示数据的,DataGridView在与数据库打交道时会常常出现,也非常有用.通过DataGridView对数据库进行更改和查询都比較方便. 这里我们须要 ...
- Android平台Camera实时滤镜实现方法探讨(十一)--实时美颜滤镜
上一章完毕了对图片的磨皮处理.经过简单算法流程优化,能够达到非常快的速度.可是不能用于实时美颜.经实验,若採用仅仅处理Y信号的方案.半径极限大约是5-10,超过10则明显感受到卡顿.但对于1920X1 ...
- SIFT算法中DoG特征点的修正
SIFT算法中,在DoG空间找到极值点后,需要对极值点进行修正,本文主要详细的讲解一下为什么需要修正,以及如何对极值点进行修正. 下图演示了二维函数离散空间得到的极值点与连续空间的极值点之间的差别 利 ...