bzoj 1876 [SDOI2009]SuperGCD(高精度+更相减损)
1876: [SDOI2009]SuperGCD
Time Limit: 4 Sec Memory Limit: 64 MB
Submit: 2384 Solved: 806
[Submit][Status][Discuss]
Description
数)!因此他经常和别人比赛计算GCD。有一天Sheng bill很嚣张地找到了你,并要求和你比
赛,但是输给Sheng bill岂不是很丢脸!所以你决定写一个程序来教训他。
Input
第一行:一个数A。
第二行:一个数B。
Output
Sample Input
54
Sample Output
HINT
对于20%的数据,0 < A , B ≤ 10 ^ 18。
对于100%的数据,0 < A , B ≤ 10 ^ 10000。
Source
【思路】
除法不会写=-=
更相减损之术:
gcd(x,y)=2*gcd(x/2,y/2) --- x为偶数,y为偶数
gcd(x,y)=gcd(x/2,y) --- x为偶数,y为奇数
gcd(x,y)=gcd(x,y/2) ---x为奇数,y为偶数
gcd(x,y)=gcd(x,x-y) (x>y) ---x为奇数,y为奇数
高精度:压位,重载运算符写得太挫了导致各种TLE <_<,学了学别人的写法。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; const int mx = ;
const int rad = 1e8; struct Bign {
int N[mx+];
Bign() {memset(N,,sizeof(N));}
int &operator [](int i) {return N[i];}
void operator /= (int x) {
for(int i=mx;i>=;i--)
N[i-]+=N[i]%x*rad,N[i]/=x;
}
void operator -= (Bign& B) {
for(int i=;i<mx;i++)
N[i]=N[i]-B[i]+(N[i-]+rad)/rad -,N[i-]=(N[i-]+rad)%rad;
}
Bign operator *= (int x) {
for(int i=;i<mx;i++)
N[i]=N[i]*x+N[i-]/rad,N[i-]%=rad;
}
bool operator > (Bign& B) {
for(int i=mx;i>=;i--)
if(N[i]!=B[i]) return N[i]>B[i];
return ;
}
void print() {
int p=mx;
while(!N[p]&&p>) p--;
printf("%d",N[p--]);
while(p) printf("%08d",N[p--]);
putchar('\n');
}
void read() {
char tp[]={'','','','','','','',''};
scanf("%s",tp+);
int L=strlen(tp+),p=;
while(L-*p+>)
sscanf(tp+L-*p+++,"%8d",&N[p]);
}
bool iszero() {
for(int i=;i<mx;i++) if(N[i]!=) return ;
return ;
}
}; Bign A,B; int main() {
A.read();B.read();
int g=; bool x,y;
while(!A.iszero() && !B.iszero()) {
x=!(A[]&),y=!(B[]&);
if(x && y) { g++;A/=;B/=; }
else if((x)||(y)) { if(x)A/=;else B/=; }
else{ if(A>B) A-=B; else B-=A; }
}
if(B>A) A=B;
for(int i=;i<g;i++) A*=;
A.print();
return ;
}
bzoj 1876 [SDOI2009]SuperGCD(高精度+更相减损)的更多相关文章
- BZOJ 1876: [SDOI2009]SuperGCD( 更相减损 + 高精度 )
更相减损,要用高精度.... --------------------------------------------------------------- #include<cstdio> ...
- BZOJ 1876 [SDOI2009] SuperGcd | PY好题
题面就是让你求两个超级大整数,求GCD 题解: 题目本意应该是出题人想考考高精度取膜 但是可以通过一种神奇的Stein算法来做 由J. Stein 1961年提出的Stein算法很好的解决了欧几里德算 ...
- C语言复习---获取最大公约数(辗转相除法和更相减损法)
源自:百度百科 辗转相除法 辗转相除法:辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法. 例如,求(,): ∵ ÷=(余319) ∴(,)=(,): ∵ ÷=(余58) ∴(,)=( ...
- 求最大公因数(辗转相除法&更相减损术)
求最大公因数(辗转相除法&更相减损术) 辗转相除法 又名欧几里得算法 ,其原理其实是基于这个定理:\(gcd(a,b)=gcd(b,a\%b)\),详细证明,而任何数与0的最大公约数是它本身 ...
- C语言,最大公约数---更相减损术
// 最大公约数 更相减损法 int commonDivisor() { int i,k,n=0; printf("请输入两个不同的正整数,用,隔开\n"); scanf(&quo ...
- BZOJ 1876: [SDOI2009]SuperGCD
1876: [SDOI2009]SuperGCD Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 3060 Solved: 1036[Submit][St ...
- 「BZOJ 1876」「SDOI 2009」SuperGCD「数论」
题意 求\(\gcd(a, b)\),其中\(a,b\leq10^{10000}\) 题解 使用\(\text{Stein}\)算法,其原理是不断筛除因子\(2\)然后使用更相减损法 如果不筛\(2\ ...
- [BZOJ1877][SDOI2009]SuperGCD
题目大意 求两个个高精度数的gcd 题目解析 在学习gcd的时候,书上就记载了"更相减损术"这一方法 基于这种方法,我们进行优化,使得我们能快速求出两个大数的gcd 对于 \(a, ...
- luogu2152 [SDOI2009]SuperGCD
要你求两个非常大的数字的GCD. 不要想复杂,用高精度整更相减损术即可. #include <cstdio> #include <cstring> #include <a ...
随机推荐
- IOS 学习日志 2015-3-17
Objective--C 一 关键字 @class 导入已有的类 id 对象类型 表示任何一个ObjC对象类型 Block 对象类型 OC中称为代码块 类似于C中的函数式指针 typedef 定义数据 ...
- MongoDB笔记(三)启动命令mongod的参数
上一节有关访问权限的笔记,是由启动命令mongod的参数auth引发的有关问题,这节就来看看mongod的其他参数 MongoDB启动命令mongod参数说明: 基本配置 --quiet # 安静输出 ...
- SSL Programming Tutorial
SSL Programming Tutorial � Table of Contents [ � Index This section demonstrates the implement ...
- mysql复制表数据或表结构到新表中
MySQL复制表数据到新表的几个步骤. 1.MySQL复制表结构及数据到新表 CREATE TABLE new_table SELECT * FROM old_table; 2.只复制表结构到新表 C ...
- jquery api 笔记(2) 事件 事件对象
事件 #1.resize() 缩放窗体:window.resizeTo(width, height); 并不是兼容做法. #2 .scroll() ->获取滚动条的位置: .scro ...
- [C#]Base使用小记
base 关键字用于从派生类中访问基类的成员: • 调用基类上已被其他方法重写的方法. • 指定创建派生类实例时应调用的基类构造函数. 基类访问只能在构造函数.实例方法或实例属性访问器中进行. 从静态 ...
- PDO操作mysql数据库(二)
从 MySQL 数据库读取数据 <?php $server = "localhost"; $user = "root"; $pwd = "123 ...
- 有反斜杠时候,CakePHP往pgsql插入数据异常
原始数据:INSERT INTO “public”.”tables” (“table”, “columns”) VALUES (‘table1\’, ‘{“col1″:false,”col2″:tru ...
- php 需熟练掌握的几个函数
class Test { } $obj = new Test; 一.__construct() {} 构造函数 二.__destroy() {} 析构函数 三.__get() {} 试图读取一个并不 ...
- PHPExcel1
下面是总结的几个使用方法 include 'PHPExcel.php'; include 'PHPExcel/Writer/Excel2007.php'; //或者include 'PHPExcel/ ...