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> ...
随机推荐
- PHP 面向对象编程笔记 (麦子 php 第二阶段)
类是把具有相似特性的对象归纳到一个类中,类就是一组相同属性和行为的对象的集合.类和对象的关系:类是相似对象的描述,先有类,再有对象.类是对象的抽象,对象是类的实例.通过class关键字创建类,成员属性 ...
- PAT-B java实现
注意:java提交PAT时,不需要加package : 类名必须是Main. 1001 害死人不偿命的(3n+1)猜想 (15) 输入格式:每个测试输入包含1个测试用例,即给出自然数n的值. 输出格式 ...
- 为什么我要放弃javaScript数据结构与算法(第三章)—— 栈
有两种结构类似于数组,但在添加和删除元素时更加可控,它们就是栈和队列. 第三章 栈 栈数据结构 栈是一种遵循后进先出(LIFO)原则的有序集合.新添加的或待删除的元素都保存在栈的同一端,称为栈顶,另一 ...
- LeetCode:3.Longest Substring Without Repeating Characters
思路:看到题目首先想到最大字符串匹配KMP算法 public static int lengthOfLongestSubstring(String s) { int maxLength = 0; St ...
- stm32--FatFs调试过程(SPIFlash)
移植方法参见我的另一篇博客:<stm32--FatFs移植(SPIFlash)>. 本文仅记录在初次移植完成后,遇到的问题,和解决的过程. 调试记录: 问题1:f_open返回3,即磁盘没 ...
- Oralce 的sql问题
获取两个日期间的工作日, SQL> select dt_time 2 from (select to_date('01-12-2010 08:20:56','dd-mm-yyyy HH: ...
- How to add a webpart to your website
I have download a webpart that can play media on the website from the internet.Then how to add ...
- 形象的理解Strong和Weak
Strong Weak
- Qt用委托绘制需要的图形的步骤
1.拷贝一份option: QStyleOptionViewItemV4 opt = option; 2.获取到widget,也是通过QStyleOptionViewItem &option ...
- 虚拟现实-VR-UE4-编辑自定义Character-上下左右移动-旋转
在上一片文章中,我创建了一个自定义的Character,但是只是有一行log显示,我使用了自己的Character,不能有任何操作,这里,我将记录我修改我的Character的过程 万事第一步,打开工 ...