一本通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普及组的题,其实还是很简单的.但为什么写这道题呢? 这道题第一次接触是在一本通刷题的时候,当时学循环结构, ...
随机推荐
- scp 免密登录ssh-copy-id 如何使用非22端口 + rsync 同步远程机器的文件到本地
其中:id_rsa为私钥文件,id_rsa.pub为公钥文件 ssh-copy-id -i ~/.ssh/id_rsa.pub "-p 2122 root@IP " 我的:s ...
- handsontable合并项mergeCells应用及扩展
由于我这个项目主要是配置多表头信息,主要使用了handsontabel合并项功能. 但是,在该功能使用过程中发现了一些问题和一些自己根据需要做的一些扩展 $("#topFieldDiv&qu ...
- vmware共享文件夹
环境: VMware Workstation 11.0 虚拟机中的系统:Ubuntu 16.04 物理机:window 7 安装好vmware tools后在 /mnt/hgfs 里没有东西,是空白的 ...
- redis的使用,相比memcached
redis支持数据持久化,不像memcached断电或者重启就丢失数据了. 支持持久化主要有两种方式,在redis.conf配置文件里配置. 1. 使用.rdb格式存储,配置save参数(save N ...
- go语言之行--网络编程、http处理流程详情
一.简介 go语言中的网络编程主要通过net包实现,net包提供了网络I/O接口,包括HTTP.TCP/IP.UDP.域名解析和Unix域socket等.和大多数语言一样go可以使用几行代码便可以启动 ...
- 20155229《网络对抗技术》Exp2:后门原理与实践
实验预习 后门: 指绕过安全控制而获取对程序或系统访问权的方法.最主要目的就是方便以后再次秘密进入或者控制系统. 木马与后门的区别: 木马:通过欺骗用户的方法(包含捆绑,利用网页等)让用户不知不觉的安 ...
- mfc CImageList和CListCtrl
知识点: CImageList类的运用 CListCtrl添加图标 一.CImageList CImageList*SetImageList(CImageList*pImageList,int nIm ...
- Dynamics CRM Online Administrator password reset
道道还挺多,好好看看 Dynamics CRM Online Administrator password reset
- 校内模拟赛 Label
题意: n个点m条边的无向图,有些点有权值,有些没有.边权都为正.给剩下的点标上数字,使得$\sum\limits_{(u,v)\in E}len(u,v) \times (w[u] - w[v]) ...
- mybatis 异常 too many connections 解决方案 mysql
参考: https://blog.csdn.net/u011628250/article/details/54017481 https://www.cnblogs.com/baby123/p/5710 ...