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 ...
随机推荐
- HDU_2156 分数矩阵
Problem Description 我们定义如下矩阵: 1/1 1/2 1/3 1/2 1/1 1/2 1 ...
- VS2010修改默认配置路径
视图->属性管理器 弹出如下截图:
- shell通过ftp实现上传/下载文件
直接代码,shell文件名为testFtptool.sh: #!/bin/bash ########################################################## ...
- svn命令操作
非超级用户:sudo 命令 svn info 查看svn地址 svn co 地址 检出仓库
- Mysql锁机制和事务控制
如何加锁 锁定表的语法: LOCK TABLES tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE} [, tbl_n ...
- Function Pointer in Delpni
program Project1; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; type TVoice = function(): Stri ...
- hadoop1 和haddop2 mapperreducer的wordcount详解
转 mapreduce中wordcount详细介绍(包括hadoop1和hadoop2版本) 发表于1年前(2014-04-24 10:08) 阅读(1458) | 评论(0) 1人收藏此文章, ...
- lua在MacOS系统上的安装方法
lua是一种非常小巧的脚本语言,由标准C编写而成,可以很方便的调用c/c++或者被c/c++.另外相关的还有一个luaJIT,是lua在某些平台上的编译器. 我们在这里只安装lua. 1.检测电脑上是 ...
- django查询常用操作符及models和admin的写法
以Publisher.Author.Book的model为例子 #coding=utf-8 from django.db import models # Create your models here ...
- KeepAlive详解
KeepAlive既熟悉又陌生,踩过坑的同学都知道痛.一线运维工程师踩坑之后对于KeepAlive的总结,你不应该错过! 最近工作中遇到一个问题,想把它记录下来,场景是这样的: 从上图可以看出,用户通 ...