http://www.lydsy.com/JudgeOnline/problem.php?id=1876

Description

Sheng bill有着惊人的心算能力,甚至能用大脑计算出两个巨大的数的GCD(最大公约 数)!因此他经常和别人比
赛计算GCD。有一天Sheng bill很嚣张地找到了你,并要求和你比 赛,但是输给Sheng bill岂不是很丢脸!所以你
决定写一个程序来教训他。

Input

共两行: 第一行:一个数A。 第二行:一个数B。
0 < A , B ≤ 10 ^ 10000。

Output

一行,表示A和B的最大公约数。

Sample Input

12
54

Sample Output

6

——————————————————————————————————

如果你会写大整数除法,请跳过这个博客。

要做这道题:

1.我们要压位,对于压位默认看博客的人已经会了,如果不会请baidu。

2.我们需要三个gcd的应用

  1.gcd(a,b)=k*gcd(a/k,b/k)(a%k==0,b%k==0)

  2.gcd(a,b)=gcd(a/k,b)(a%k==0&&b%k!=0)

  3.gcd(a,b)=gcd(b,a-b)(a>b)

然后我们每次进行3操作的时候,用1和2操作来预先分离出来k,减少计算量。

这里取k=2,我们发现这种操作有着很妙的优化:

对于每次操作3,如果是:

  1.至少一个偶数,那么就1或2操作,至少减少了其中一个数一半的大小。

  2.无偶数,则3操作之后一定能变成1情况。

所以我们大概是能减少一半的运算量,这明显十分的妙!

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll big=1e9;
const int p=;
const int N=;
char s1[N],s2[N];
ll a[N],b[N];
int la=,lb=;
inline int pan(){
if(la>lb)return ;
if(la<lb)return ;
for(int i=la-;i>=;i--){
if(a[i]>b[i])return ;
if(a[i]<b[i])return ;
}
return ;
}
void diva(){
for(int i=la-;i>=;i--){
if(!(a[i]&))a[i]>>=;
else{
a[i-]+=big;
a[i]>>=;
}
}
  if(!a[la-])la--;
return;
}
void divb(){
for(int i=lb-;i>=;i--){
if(!(b[i]&))b[i]>>=;
else{
b[i-]+=big;
b[i]>>=;
}
}
if(!b[lb-])lb--;
return;
}
int change(char s[],ll n[]){
char temp[N];
int l=strlen(s),cur=;
while(l/p){
strncpy(temp,s+l-p,p);
n[cur++]=atoi(temp);
l-=p;
}
if(l){
memset(temp,,sizeof(temp));
strncpy(temp,s,l);
n[cur++]=atoi(temp);
}
return cur;
}
void init(){
scanf("%s%s",s1,s2);
la=change(s1,a);
lb=change(s2,b);
return;
}
int k_2=;
void gcd(){
while(){
int a_2=,b_2=;
while(!(a[]&)){diva();a_2++;}
while(!(b[]&)){divb();b_2++;}
k_2+=min(a_2,b_2);
int pi=pan();
if(pi==){
for(int i=;i<la;i++){
if(a[i]<b[i]){
a[i]+=big;
a[i+]--;
}
a[i]=a[i]-b[i];
}
for(int i=la-;i>=;i--){
if(a[i])break;
else la--;
}
}else if(pi==){
for(int i=;i<lb;i++){
if(b[i]<a[i]){
b[i]+=big;
b[i+]--;
}
b[i]=b[i]-a[i];
}
for(int i=lb-;i>=;i--){
if(b[i])break;
else lb--;
}
}else return;
}
return;
}
int main(){
init();
gcd();
for(int i=;i<=k_2;i++){
for(int j=;j<la;j++){
a[j]<<=;
}
for(int j=;j<la;j++){
if(a[j]>big){
a[j+]+=a[j]/big;
a[j]%=big;
if(j+>=la)la++;
}
}
}
printf("%lld",a[la-]);
for(int i=la-;i>=;i--){
printf("%0*lld",p,a[i]);
}
printf("\n");
return ;
}

BZOJ1876:[SDOI2009]SuperGCD——C++高精度良心题解的更多相关文章

  1. [BZOJ1876][SDOI2009]superGCD(高精度)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1876 分析: 以为辗转相减会TLE呢……但是好像没这个数据……就这么水过去了…… 辗转 ...

  2. bzoj 1876 [SDOI2009]SuperGCD(高精度+更相减损)

    1876: [SDOI2009]SuperGCD Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 2384  Solved: 806[Submit][Sta ...

  3. 【bzoj1876】[SDOI2009]SuperGCD(高精度)

    题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1876 一道简单的高精度+Stein算法(或者叫辗转相除法)求最大公约数板子题. md还 ...

  4. BZOJ1876 [SDOI2009]SuperGCD 【高精 + GCD优化】

    题目 Sheng bill有着惊人的心算能力,甚至能用大脑计算出两个巨大的数的GCD(最大公约 数)!因此他经常和别人比 赛计算GCD.有一天Sheng bill很嚣张地找到了你,并要求和你比 赛,但 ...

  5. 洛谷 P2152 [SDOI2009]SuperGCD (高精度)

    这道题直接写了我两个多小时-- 主要是写高精度的时候还存在着一些小毛病,调了很久 在输入这一块卡了很久. 然后注意这里用while的形式写,不然会炸 最后即使我已经是用的万进制了,但是交上去还是有两个 ...

  6. bzoj1876: [SDOI2009]SuperGCD

    更相减损数. 上手就debug了3个小时,直接给我看哭了. 3个函数都写错了是什么感受? 乘2函数要从前往后乘,这样后面的数乘2进位以后不会干扰前面的数. 除2函数要从后往前除,这样前面的数借来的位不 ...

  7. bzoj千题计划288:bzoj1876: [SDOI2009]SuperGCD

    http://www.lydsy.com/JudgeOnline/problem.php?id=1876 高精压位GCD 对于  GCD(a, b)  a>b 若 a 为奇数,b 为偶数,GCD ...

  8. 【BZOJ1876】[SDOI2009]SuperGCD(数论,高精度)

    [BZOJ1876][SDOI2009]SuperGCD(数论,高精度) 题面 BZOJ 洛谷 题解 那些说数论只会\(gcd\)的人呢?我现在连\(gcd\)都不会,谁来教教我啊? 显然\(gcd\ ...

  9. BZOJ 1876: [SDOI2009]SuperGCD( 更相减损 + 高精度 )

    更相减损,要用高精度.... --------------------------------------------------------------- #include<cstdio> ...

随机推荐

  1. 「LeetCode」0002-Longest Substring Without Repeating Characters(C++)

    分析 贪心思想.注意更新每次判断的最长不同子串的左区间的时候,它是必须单调增的(有时候会在这里翻车). 代码 关掉流同步能有效提高速度. static const auto io_sync_off = ...

  2. 「日常训练」Regular Bridge(Codeforces Round 306 Div.2 D)

    题意与分析 图论基础+思维题. 代码 #include <bits/stdc++.h> #define MP make_pair #define PB emplace_back #defi ...

  3. APP性能测试工具-GT(随身调)

    GT(随身调)是APP的随身调测平台,它是直接运行在手机上的“集成调测环境”(IDTE, Integrated Debug Environment).利用GT,仅凭一部手机,无需连接电脑,您即可对AP ...

  4. 在几份docx文档中里查找某个值

    import docx, os def readDocx(fileName): doc = docx.Document(fileName) content = '\n'.join([para.text ...

  5. scipy 图像处理-深度学习

    scipy 图像处理(scipy.misc.scipy.ndimage).matplotlib 图像处理 from scipy.misc import imread / imsave / imshow ...

  6. LeetCode - 136. Single Number - ( C++ ) - 解题报告 - 位运算思路 xor

    1.题目大意 Given an array of integers, every element appears twice except for one. Find that single one. ...

  7. 以太坊开发(二)使用Ganache CLI在私有链上搭建智能合约

    以太坊开发(二)使用Ganache CLI在私有链上搭建智能合约 在上一篇文章中,我们使用Truffle自带的客户端Truffle Develop,在私有链上搭建并运行了官方提供的WebPack智能合 ...

  8. 系统滴答定时器(SysTick)中断配置

    系统滴答定时器(SysTick)中断配置 在STM32标准库中是通过SysTick_Config()函数配置时钟中断的,然后SysTick_Handler()函数自动定时触发其中的函数. if(Sys ...

  9. forward_list

    一.特性 单向链表,只支持单向顺序访问(不支持快速随机访问),是C++11标准新增的类型 可类比于数据结构——单(向)链表 1. 没有size操作 forward_list为了追求性能,省去了size ...

  10. 福大软工1816:Alpha(7/10)

    Alpha 冲刺 (7/10) 队名:Jarvis For Chat 组长博客链接 本次作业链接 团队部分 团队燃尽图 工作情况汇报 张扬(组长) 过去两天完成了哪些任务: 文字/口头描述: 1.完成 ...