BZOJ1876:[SDOI2009]SuperGCD——C++高精度良心题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1876
Description
Input
Output
一行,表示A和B的最大公约数。
Sample Input
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++高精度良心题解的更多相关文章
- [BZOJ1876][SDOI2009]superGCD(高精度)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1876 分析: 以为辗转相减会TLE呢……但是好像没这个数据……就这么水过去了…… 辗转 ...
- bzoj 1876 [SDOI2009]SuperGCD(高精度+更相减损)
1876: [SDOI2009]SuperGCD Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 2384 Solved: 806[Submit][Sta ...
- 【bzoj1876】[SDOI2009]SuperGCD(高精度)
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1876 一道简单的高精度+Stein算法(或者叫辗转相除法)求最大公约数板子题. md还 ...
- BZOJ1876 [SDOI2009]SuperGCD 【高精 + GCD优化】
题目 Sheng bill有着惊人的心算能力,甚至能用大脑计算出两个巨大的数的GCD(最大公约 数)!因此他经常和别人比 赛计算GCD.有一天Sheng bill很嚣张地找到了你,并要求和你比 赛,但 ...
- 洛谷 P2152 [SDOI2009]SuperGCD (高精度)
这道题直接写了我两个多小时-- 主要是写高精度的时候还存在着一些小毛病,调了很久 在输入这一块卡了很久. 然后注意这里用while的形式写,不然会炸 最后即使我已经是用的万进制了,但是交上去还是有两个 ...
- bzoj1876: [SDOI2009]SuperGCD
更相减损数. 上手就debug了3个小时,直接给我看哭了. 3个函数都写错了是什么感受? 乘2函数要从前往后乘,这样后面的数乘2进位以后不会干扰前面的数. 除2函数要从后往前除,这样前面的数借来的位不 ...
- 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(数论,高精度)
[BZOJ1876][SDOI2009]SuperGCD(数论,高精度) 题面 BZOJ 洛谷 题解 那些说数论只会\(gcd\)的人呢?我现在连\(gcd\)都不会,谁来教教我啊? 显然\(gcd\ ...
- BZOJ 1876: [SDOI2009]SuperGCD( 更相减损 + 高精度 )
更相减损,要用高精度.... --------------------------------------------------------------- #include<cstdio> ...
随机推荐
- 「LeetCode」0002-Longest Substring Without Repeating Characters(C++)
分析 贪心思想.注意更新每次判断的最长不同子串的左区间的时候,它是必须单调增的(有时候会在这里翻车). 代码 关掉流同步能有效提高速度. static const auto io_sync_off = ...
- 「日常训练」Regular Bridge(Codeforces Round 306 Div.2 D)
题意与分析 图论基础+思维题. 代码 #include <bits/stdc++.h> #define MP make_pair #define PB emplace_back #defi ...
- APP性能测试工具-GT(随身调)
GT(随身调)是APP的随身调测平台,它是直接运行在手机上的“集成调测环境”(IDTE, Integrated Debug Environment).利用GT,仅凭一部手机,无需连接电脑,您即可对AP ...
- 在几份docx文档中里查找某个值
import docx, os def readDocx(fileName): doc = docx.Document(fileName) content = '\n'.join([para.text ...
- scipy 图像处理-深度学习
scipy 图像处理(scipy.misc.scipy.ndimage).matplotlib 图像处理 from scipy.misc import imread / imsave / imshow ...
- LeetCode - 136. Single Number - ( C++ ) - 解题报告 - 位运算思路 xor
1.题目大意 Given an array of integers, every element appears twice except for one. Find that single one. ...
- 以太坊开发(二)使用Ganache CLI在私有链上搭建智能合约
以太坊开发(二)使用Ganache CLI在私有链上搭建智能合约 在上一篇文章中,我们使用Truffle自带的客户端Truffle Develop,在私有链上搭建并运行了官方提供的WebPack智能合 ...
- 系统滴答定时器(SysTick)中断配置
系统滴答定时器(SysTick)中断配置 在STM32标准库中是通过SysTick_Config()函数配置时钟中断的,然后SysTick_Handler()函数自动定时触发其中的函数. if(Sys ...
- forward_list
一.特性 单向链表,只支持单向顺序访问(不支持快速随机访问),是C++11标准新增的类型 可类比于数据结构——单(向)链表 1. 没有size操作 forward_list为了追求性能,省去了size ...
- 福大软工1816:Alpha(7/10)
Alpha 冲刺 (7/10) 队名:Jarvis For Chat 组长博客链接 本次作业链接 团队部分 团队燃尽图 工作情况汇报 张扬(组长) 过去两天完成了哪些任务: 文字/口头描述: 1.完成 ...