一本通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普及组的题,其实还是很简单的.但为什么写这道题呢? 这道题第一次接触是在一本通刷题的时候,当时学循环结构, ...
随机推荐
- Python2.7-shelve
shelve模块,持久化对象数据,可以说是 pickle 模块的封装,用于把像字典一样的以键-值存储的数据持久化存储,像操作数据库.当我们写程序的时候如果不想用关系数据库那么重量级的东东去存储数据,不 ...
- 学习笔记---gson
1.gson变量定义注解 @SerializedName("char") private String charm;//mongo转化char 2.gson中json文件转化成类 ...
- 理解ASP.NET的IDataReader
理解ASP.NET的IDataReader ADO.NET DataReader对象可以从数据库中检索只读.只进的数据流.因为每次在内存中的数据只有一行,所以使用DataReader可提高应用程序的性 ...
- 一个有趣的异步时序逻辑电路设计实例 ——MFM调制模块设计笔记
本文从本人的163博客搬迁至此. MFM是改进型频率调制的缩写,其本质是一种非归零码,是用于磁介质硬盘存储的一种调制方式.调制规则有两句话,即两个翻转条件: 1.为1的码元在每个码元的正中进行一次翻转 ...
- sprintboot 和swagger2整合生成文档
1.创建springboot 工程 2.引入maven依赖 <dependency> <groupId>io.springfox</groupId> <art ...
- 1、JVM 内存模型+运行时数据区+JVM参数
JMM(内存模型) 1.’主内存+每个线程有自己的内存 JVM运行时数据区 包含:1.程序计算器(每个线程自带):2.JAVA-STACK(每个线程自带):3.本地方法stack:4.堆:5.方法区 ...
- sql——sql中的各种连接
现有两张表 tablea 和 tableb 各种连接 1.笛尔卡积 SELECT * FROM TabA a,TabB b where a.id = b.id /*笛尔卡积乘积*/ 返回的结果 ...
- 项目 - RM 部署上centos7 之后出现的一些问题和解决方法
系统版本: [root@localhost logs]# cat /etc/redhat-release CentOS Linux release (Core) 获取方法来自:https://www. ...
- [CF1083D]The Fair Nut’s getting crazy[单调栈+线段树]
题意 给定一个长度为 \(n\) 的序列 \(\{a_i\}\).你需要从该序列中选出两个非空的子段,这两个子段满足 两个子段非包含关系. 两个子段存在交. 位于两个子段交中的元素在每个子段中只能出现 ...
- Android几行代码实现监听微信聊天
原创作品,转载请注明出处,尊重别人的劳动果实. 2017.2.7更新: *现在适配微信版本更加容易了,只需要替换一个Recourse-ID即可 *可以知道对方发的是小视频还是语音,并获取秒数. *可以 ...