一本通1630SuperGCD
1630:SuperGCD
时间限制: 1000 ms 内存限制: 524288 KB
【题目描述】
来源:SDOI 2009
Sheng Bill 有着惊人的心算能力,甚至能用大脑计算出两个巨大的数的 GCD(最大公约数)!因此他经常和别人比赛计算 GCD。有一天 Sheng Bill 很嚣张地找到了你,并要求和你比赛,但是输给 Sheng Bill 岂不是很丢脸!所以你决定写一个程序来教训他。
【输入】
输入共两行,第一行一个数 A,第二行一个数 B。
【输出】
一行,表示 A 和 B 的最大公约数。
【输入样例】
12
54
【输出样例】
6
【提示】
数据范围与提示:
对于全部数据,0<A,B≤1010000。
sol:就是这道题的加强版,方法几乎一样,只是压4位过不去,要压八位,但是最后涉及到乘法需要long long,又会变慢,所以要记录要乘的 2 的个数,在最后统计答案的时候一个个乘进去,我复杂度非常劣
#include <bits/stdc++.h>
using namespace std;
typedef int ll;
inline ll read()
{
ll s=;
bool f=;
char ch=' ';
while(!isdigit(ch))
{
f|=(ch=='-'); ch=getchar();
}
while(isdigit(ch))
{
s=(s<<)+(s<<)+(ch^); ch=getchar();
}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<)
{
putchar('-'); x=-x;
}
if(x<)
{
putchar(x+''); return;
}
write(x/);
putchar((x%)+'');
return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
inline void Read_S(char *S)
{ int Len=;
char ch=' ';
while(!isdigit(ch))
{
ch=getchar();
}
while(ch=='')
{
ch=getchar();
}
while(isdigit(ch))
{
S[++Len]=ch; ch=getchar();
}
return;
}
const int N=;
const int Base=,Power=;
char SX[N],SY[N];
struct BigNum
{
int a[N];
BigNum()
{
memset(a,,sizeof a);
}
BigNum(char *S)
{
memset(a,,sizeof a);
int i,bb,Pos=,Len=strlen(S+);
a[]=(Len-)/Power+;
for(i=;i<=Len;i++)
{
if((i-)%Power==)
{
Pos++; bb=;
}
a[Pos]+=bb*(S[i]-'');
bb*=;
}
}
inline void Print()
{
write(a[a[]]);
int i;
for(i=a[]-;i>=;i--)
{
if(a[i]<) putchar('');
if(a[i]<) putchar('');
if(a[i]<) putchar('');
if(a[i]<) putchar('');
if(a[i]<) putchar('');
if(a[i]<) putchar('');
if(a[i]<) putchar('');
write(a[i]);
}
}
#define P(x) x.Print(),putchar(' ')
#define Pl(x) x.Print(),putchar('\n')
};
BigNum X,Y;
//BigNum Ans;
inline bool operator<(const BigNum &p,const BigNum &q)
{
if(p.a[]!=q.a[]) return p.a[]<q.a[];
int i;
for(i=p.a[];i>=;i--) if(p.a[i]!=q.a[i])
{
return p.a[i]<q.a[i];
}
return false;
}
inline bool operator==(const BigNum &p,const BigNum &q)
{
if(p.a[]!=q.a[]) return false;
int i;
for(i=p.a[];i>=;i--) if(p.a[i]!=q.a[i])
{
return false;
}
return true;
}
inline BigNum operator-(const BigNum &p,const BigNum &q)
{
int i;
BigNum ans=p;
for(i=;i<=q.a[];i++)
{
ans.a[i]-=q.a[i];
if(ans.a[i]<)
{
ans.a[i]+=Base;
ans.a[i+]--;
}
}
while((!ans.a[ans.a[]])&&ans.a[]) ans.a[]--;
return ans;
}
inline BigNum operator*(const BigNum &p,const BigNum &q)
{
int i,j;
BigNum ans; ans.a[]=max(p.a[],q.a[]);
for(i=;i<=p.a[];i++)
{
for(j=;j<=q.a[];j++)
{
ans.a[i+j-]+=p.a[i]*q.a[j];
ans.a[i+j]+=ans.a[i+j-]/Base;
ans.a[i+j-]%=Base;
}
}
while(ans.a[ans.a[]+]) ans.a[]++;
while(!ans.a[ans.a[]]) ans.a[]--;
return ans;
}
inline bool Judge_Ou(BigNum p)
{
if(!p.a[]) return ;
return (p.a[]&)?:;
}
inline BigNum Div2(BigNum p)
{
BigNum ans;
ans.a[]=p.a[];
int i;
for(i=p.a[];i>=;i--)
{
ans.a[i]+=(p.a[i]>>);
if(p.a[i]&) p.a[i-]+=Base;
}
while(!ans.a[ans.a[]]) ans.a[]--;
return ans;
}
inline BigNum Mul2(BigNum p)
{
BigNum ans;
ans.a[]=p.a[];
int i;
for(i=;i<=p.a[];i++)
{
p.a[i]<<=;
if(p.a[i]>Base)
{
ans.a[i+]+=p.a[i]/Base;
p.a[i]%=Base;
}
ans.a[i]+=p.a[i];
}
while(ans.a[ans.a[]+]) ans.a[]++;
return ans;
}
int main()
{
int i;
Read_S(SX);
reverse(SX+,SX+strlen(SX+)+);
X=BigNum(SX);
Read_S(SY);
reverse(SY+,SY+strlen(SY+)+);
Y=BigNum(SY);
// Ans.a[0]=Ans.a[1]=1;
int Ges2=;
while(!(X==Y))
{
// P(X); Pl(Y);
bool BoX=Judge_Ou(X),BoY=Judge_Ou(Y);
if(BoX)
{
if(BoY)
{
X=Div2(X); Y=Div2(Y);
// Ans=Mul2(Ans);
Ges2++;
}
else
{
X=Div2(X);
}
}
else
{
if(BoY)
{
Y=Div2(Y);
}
else
{
BigNum p,q;
if(X<Y) p=Y,q=X;
else p=X,q=Y;
X=p-q; Y=q;
}
}
}
for(i=;i<=Ges2;i++) X=Mul2(X);
// Ans=Ans*X;
// Pl(Ans);
Pl(X);
return ;
}
一本通1630SuperGCD的更多相关文章
- CJOJ 2040 【一本通】分组背包(动态规划)
CJOJ 2040 [一本通]分组背包(动态规划) Description 一个旅行者有一个最多能用V公斤的背包,现在有n件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2, ...
- CJOJ 2307 【一本通】完全背包(动态规划)
CJOJ 2307 [一本通]完全背包(动态规划) Description 设有n种物品,每种物品有一个重量及一个价值.但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n种物品中选取若干 ...
- CJOJ 2022 【一本通】简单的背包问题(搜索)
CJOJ 2022 [一本通]简单的背包问题(搜索) Description 设有一个背包可以放入的物品重量为S,现有n件物品,重量分别是w1,w2,w3,-wn. 问能否从这n件物品中选择若干件放入 ...
- CJOJ 2044 【一本通】最长公共子序列(动态规划)
CJOJ 2044 [一本通]最长公共子序列(动态规划) Description 一个给定序列的子序列是在该序列中删去若干元素后得到的序列.确切地说,若给定序列X,则另一序列Z是X的子序列是指存在一个 ...
- 【一本通1329:【例8.2】细胞&&洛谷P1451 求细胞数量】
1329:[例8.2]细胞 [题目描述] 一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数.如: 阵列 4 10 023 ...
- 一本通 1223:An Easy Problem
\[传送门qwq\] [题目描述] 给定一个正整数N,求最小的.比N大的正整数M,使得M与N的二进制表示中有相同数目的1. 举个例子,假如给定的N为78,其二进制表示为1001110,包含4个1,那么 ...
- 一本通之 一堆迷宫 (Dungeon Master&走出迷宫&走迷宫)
一本通在线崩溃....... . 有图有真相 这是个三维迷宫,其实和二位迷宫差不多,只是方向多加了2个. 但这个题的输入十分恶心,一度被坑的用cin.ignore(),但还是不过... 它的正确输入方 ...
- 一本通 1212:LETTERS
题目描述 给出一个roe×col的大写字母矩阵,一开始的位置为左上角,你可以向上下左右四个方向移动,并且不能移向曾经经过的字母.问最多可以经过几个字母. 输入 第一行,输入字母矩阵行数R和列数S,1≤ ...
- 【洛谷p2669】【一本通p1100】金币
(今天高产) 金币[传送门] 洛谷上的算法标签 自我感觉主要靠循环 这道题是2015年NOIp普及组的题,其实还是很简单的.但为什么写这道题呢? 这道题第一次接触是在一本通刷题的时候,当时学循环结构, ...
随机推荐
- python下载安装搭建
python官网下载python运行环境(https://www.python.org/downloads/),建议下载稳定版本,不推荐使用最新版本 安装 然后我们打开CMD,在里面输入python, ...
- AI1.1-人工智能史
来自:http://zh.wikipedia.org/wiki/人工智能史#CITEREFBerlinski2000 这篇是来自维基百科上面的人工智能史,将其大部分保留(真的是大部分,所以差不多没有原 ...
- 注冊成为Windows Phone开发人员而且解锁Windows Phone 8.1手机
注冊成为Windows Phone开发人员而且解锁Windows Phone 8.1手机 上篇文章介绍了怎样使用Qt Creator和Visual Studio构建Windows Phone 8.1应 ...
- sql查询语句示例
今天没事又专门学习了一下sql查询语句,个人感觉太重要了,于是就找了网上的一个示例自己练了起来,感觉学到了很多,下面跟大家分享一下sql查询语句的示例操作. 首先,我建了5张表,分别如下: (a)学生 ...
- asp.net mvc2+nhibernate实体类映射问题之“尝试创建Controller类型的控制器时出错请确保控制器具有无参数公共构造函数”
程序出了问题,解决后发现如此简单,犯的错误是如此的低级啊,特此记录! 运行程序总是在浏览器中看到一片空白,什么也没有,用application_error跟踪发现抓出一个这样的异常 然后浏览器中就是这 ...
- 蓝牙disable流程简述
蓝牙关闭的流程比打开流程要简单,主要就是一些profile的断连以及协议栈相关结构的释放. 这里简单说一下其流程,就直接从协议栈的disable的接口说起了. static int disable(v ...
- JS计算混合字符串长度
用的是正则表达式 var str = ”坦克是tank的音译”; var len = str.match(/[^ -~]/g) == null ? str.length : str.length + ...
- [CF1007D]Ants[2-SAT+树剖+线段树优化建图]
题意 我们用路径 \((u, v)\) 表示一棵树上从结点 \(u\) 到结点 \(v\) 的最短路径. 给定一棵由 \(n\) 个结点构成的树.你需要用 \(m\) 种不同的颜色为这棵树的树边染色, ...
- JVM技术周报第1期
JVM技术周报 · 第1期 JVM技术每周分享整理了JVM技术交流群每周讨论的内容,由群内成员整理归纳而成.如果你有兴趣入群讨论,请关注「Java技术精选」公众号,通过右下角菜单「入群交流」加我好友, ...
- CSS 天坑 I - 字体单位
首先,本文所讨论的“坑”是在做回应式网页设计( Responsive Web Design 以下简称 RWD)时显现的,如果你还只是在做传统的Web设计这算不上是一个坑,因为传统的Web页面是死的,不 ...