BZOJ1876 [SDOI2009]SuperGCD 【高精 + GCD优化】
题目
Sheng bill有着惊人的心算能力,甚至能用大脑计算出两个巨大的数的GCD(最大公约 数)!因此他经常和别人比
赛计算GCD。有一天Sheng bill很嚣张地找到了你,并要求和你比 赛,但是输给Sheng bill岂不是很丢脸!所以你
决定写一个程序来教训他。
输入格式
共两行: 第一行:一个数A。 第二行:一个数B。
0 < A , B ≤ 10 ^ 10000。
输出格式
一行,表示A和B的最大公约数。
输入样例
12
54
输出样例
6
题解
时隔大半年,我回来A这道题啦【当初写的太BUG了】
求GCD,很容一想到辗转相除,而高精不好操作取模,这就用到了辗转相除法的本质:更相减损法
GCD(a,b) = GCD(a,a-b) 【a >b】
然而这样会T,所以我们还要优化:
GCD(a,b) = 2*GCD(a/2,b/2) 【2|a且2|b】
GCD(a,b) = GCD(a/2,b) 【2|a】
GCD(a,b) = GCD(a,b/2) 【2|b】
GCD(a,b) = GCD(a,a-b) 【a >b】
加上个压位高精【高精减法,高精除低精,高精乘低精,高精比较】
就可以A了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
using namespace std;
const int maxn = 10005,B = 4,Base = 10000,maxm = 100005,INF = 1000000000;
struct NUM{
int s[maxn],len;
NUM() {memset(s,0,sizeof(s)); len = 0;}
};
istream& operator >>(istream& in,NUM& a){
string s;
in>>s;
int temp = 0,t = 1;
for (int i = s.length() - 1; i >= 0; i--){
temp = temp + t * (s[i] - '0');
if (t * 10 == Base) a.s[++a.len] = temp,temp = 0,t = 1;
else t *= 10;
}
if (temp) a.s[++a.len] = temp;
return in;
}
ostream& operator <<(ostream& out,const NUM& a){
if (!a.len) out<<0;
else {
printf("%d",a.s[a.len]);
for (int i = a.len - 1; i > 0; i--) printf("%04d",a.s[i]);
}
return out;
}
bool check(const NUM& a){return !(a.s[1] & 1);}
bool equal(const NUM& a,const NUM& b){
if (a.len != b.len) return false;
REP(i,a.len) if (a.s[i] != b.s[i]) return false;
return true;
}
bool operator <(const NUM& a,const NUM& b){
if (a.len < b.len) return true;
if (a.len > b.len) return false;
for (int i = a.len; i > 0; i--){
if (a.s[i] < b.s[i]) return true;
if (a.s[i] > b.s[i]) return false;
}
return false;
}
void Half(NUM& a){
int carry = 0,temp;
for (int i = a.len; i > 0; i--){
temp = (a.s[i] + carry * Base) / 2;
carry = a.s[i] + carry * Base - temp * 2;
a.s[i] = temp;
}
while (!a.s[a.len]) a.len--;
}
void Twice(NUM& a){
int carry = 0,temp;
for (int i = 1; i <= a.len; i++){
temp = a.s[i] * 2 + carry;
a.s[i] = temp % Base;
carry = temp / Base;
}
while (carry) a.s[++a.len] = carry % Base,carry /= Base;
}
NUM operator -(const NUM& a,const NUM& b){
NUM c; c.len = a.len;
int carry = 0,temp;
for (int i = 1; i <= a.len; i++){
temp = a.s[i] - b.s[i] + carry;
if (temp < 0) carry = -1,temp += Base;
else carry = 0;
c.s[i] = temp;
}
while (!c.s[c.len]) c.len--;
return c;
}
int main(){
NUM A,B; int cnt = 0;
cin>>A>>B;
while (!equal(A,B)){
if (check(A) && check(B)) Half(A),Half(B),cnt++;
else if (check(A)) Half(A);
else if (check(B)) Half(B);
else {
if (B < A) swap(A,B);
B = B - A;
}
}
while (cnt--) Twice(A);
cout<<A<<endl;
return 0;
}
BZOJ1876 [SDOI2009]SuperGCD 【高精 + GCD优化】的更多相关文章
- bzoj千题计划288:bzoj1876: [SDOI2009]SuperGCD
http://www.lydsy.com/JudgeOnline/problem.php?id=1876 高精压位GCD 对于 GCD(a, b) a>b 若 a 为奇数,b 为偶数,GCD ...
- [BZOJ1876][SDOI2009]superGCD(高精度)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1876 分析: 以为辗转相减会TLE呢……但是好像没这个数据……就这么水过去了…… 辗转 ...
- bzoj1876: [SDOI2009]SuperGCD
更相减损数. 上手就debug了3个小时,直接给我看哭了. 3个函数都写错了是什么感受? 乘2函数要从前往后乘,这样后面的数乘2进位以后不会干扰前面的数. 除2函数要从后往前除,这样前面的数借来的位不 ...
- 【BZOJ1876】[SDOI2009]SuperGCD(数论,高精度)
[BZOJ1876][SDOI2009]SuperGCD(数论,高精度) 题面 BZOJ 洛谷 题解 那些说数论只会\(gcd\)的人呢?我现在连\(gcd\)都不会,谁来教教我啊? 显然\(gcd\ ...
- 【学术篇】SDOI2009 SuperGCD
特别说明: 为了避免以后搬家时的麻烦, 这里的文章继续沿用csdn的风格和分类好了~ Emmmm这个题是一道高精度的模板题啊~ 既然是高精度的裸题, 那我们这些懒人当然是选择:用python啦~ 懒癌 ...
- BZOJ 1876: [SDOI2009]SuperGCD
1876: [SDOI2009]SuperGCD Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 3060 Solved: 1036[Submit][St ...
- bzoj 1876 [SDOI2009]SuperGCD(高精度+更相减损)
1876: [SDOI2009]SuperGCD Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 2384 Solved: 806[Submit][Sta ...
- bzoj 3287: Mato的刷屏计划 高精水题 && bzoj AC150
3287: Mato的刷屏计划 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 124 Solved: 43[Submit][Status] Desc ...
- BZOJ 1876: [SDOI2009]SuperGCD( 更相减损 + 高精度 )
更相减损,要用高精度.... --------------------------------------------------------------- #include<cstdio> ...
随机推荐
- Spring笔记2
Bean生命周期 1 实例化 2 注入属性 3 BeanNameAware 4 BeanFactoryAware 5 ApplicationContextAware 6 BeanPostProcess ...
- thinkphp5一些文件夹用法
一.vendor通常放一些第三方的文件,如短信.支付宝等.用法: 1.在vendor中建一个文件夹: 2.在文件夹中新建一个类:主要命名空间(没有vendor ):如下面: 3.在控制器中调用,除了通 ...
- 在Pycharm中导入第三方模块库(诸如:matplotlib、numpy等)
在Pycharm中导入第三方模块库 一.打开pycharm: 二.点击菜单上的“file” -> “setting”: 三.步骤二完成后出现界面如下所示.选中你的项目(比如thisyan Pro ...
- ZooKeeper(3)-内部原理
一. 节点类型 二. Stat结构体 1)czxid-创建节点的事务zxid 每次修改ZooKeeper状态都会收到一个zxid形式的时间戳,也就是ZooKeeper事务ID. 事务ID是ZooKee ...
- Logistic Regression学习笔记
1.李航<统计学习方法>: 2.https://blog.csdn.net/laobai1015/article/details/78113214 3.http://www.cnblogs ...
- python 使用生成器 来完成 监听文件输入的例子
def tail(filename):#函数 f = open(filename,encoding='utf-8') while True: line = f.readline() if line.s ...
- 工作中使用的linux命令汇总
ln -s /usr/local/tomcat/ ./tomcat 创建软连接到/usr/local/tomcat tar -zxvf apache-kylin-2.4.0-bin-hbase1 ...
- 2018年第九届蓝桥杯【C++省赛B组】【第二题:明码】
参考:https://blog.csdn.net/qq_34202873/article/details/79784242 #include <bits/stdc++.h> using n ...
- AES128加密-S盒和逆S盒构造推导及代码实现
文档引用了<密码编码学与网络安全--原理和实践>里边的推导过程,如有不妥,请与我联系修改. 文档<FIPS 197>高级加密标准AES,里边有个S盒构造,涉及到了数论和有限域的 ...
- Spring 框架控制器类方法可用的参数与返回类型
参数类型 Spring 有内建的 HTTP 消息转换器用于部分简单类型之间的转换 标准 Servlet 类型:HttpServletRequest, HttpServletResponse, Http ...