传送门

非常显du然liu的一道题

就是求GCD

因为数据范围...

所以要上压位高精+非递归的辗转相减

关于辗转相减:

如果 A是二的倍数,B是二的倍数   那么GCD(A,B)=2 * GCD(A,B)

如果只有A是二的倍数   那么GCD(A,B)=GCD(A/2,B)

如果只有B是二的倍数   那么GCD(A,B)=GCD(A,B/2)

十分显然的结论...

然后不停地让大的数减去小的数

最后当它们相等时就是GCD了(因为大的减小的一直减到不能减就相当于取模)

int slove()
{
int A=read(),B=read(),i=,j=;
while(!(A&)) A>>=,i++;
while(!(B&)) B>>=,j++;
//先把A,B都除成奇数
//这样之后辗转相减时就不会出现两个数都是偶数的情况了
//可以减少判断次数
int cnt=min(i,j);
while()
{
if(A<B) swap(A,B);
if(A==B) return A<<cnt;
A=A-B;
while(!(A&)) A>>=;
}
}

普通的辗转相减法

然后就是恶心的压位高精了...

可以发现我们高精乘除都只乘除2,所以只要写高精乘2和高精除2以及高精减法就好了

重载运算符和压位都是基本操作了

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long ll;
const ll wid=;
char ch[];
struct bigint
{
ll s[],len;
bigint() { memset(s,,sizeof(s)); len=; }
inline void read()
{
scanf("%s",ch+);
int l=strlen(ch+),t=,k=; len=(l+)/;
for(int i=l;i;i--)
{
if(!(l-i)%){ k=; t++; }
s[t]+=k*(ch[i]^); k*=;
}
}
inline void print()
{
if(!len) { printf("0\n"); return; }
printf("%lld",s[len]);
for(int i=len-;i;i--) printf("%08lld",s[i]);//除了第一位不足的位用0补
printf("\n");
}
inline bool operator < (const bigint &tmp) const {
if(len!=tmp.len) return len<tmp.len;
for(int i=tmp.len;i;i--) if(s[i]!=tmp.s[i]) return s[i]<tmp.s[i];
return ;
}
inline bool operator == (const bigint &tmp) const {
return !(tmp<*this)&&!(*this<tmp);
}
inline bigint operator - (const bigint &tmp) const {
bigint u; u.len=len;
for(int i=;i<=len;i++)
{
u.s[i]+=s[i]-tmp.s[i];
if(u.s[i]<) u.s[i]+=wid,u.s[i+]--;
}
while(!u.s[u.len]&&u.len) u.len--;
return u;
}
inline bool pd(){ return s[]&; }//判断奇偶
inline void div2()//除2
{
len+=;
for(int i=len;i;i--)
{
if(s[i]&) s[i-]+=wid;
s[i]>>=;
}
while(!s[len]&&len) len--;
}
inline void mul2()//乘2
{
for(int i=;i<=len;i++) s[i]*=;
len+=;
for(int i=;i<=len;i++)
{
s[i+]+=s[i]/wid;
s[i]%=wid;
}
while(!s[len]&&len) len--;
}
}a,b; void slove()
{
int i=,j=;
while(!a.pd()) a.div2(),i++;
while(!b.pd()) b.div2(),j++;
if(i>j) i=j;
while()
{
if(a<b) swap(a,b);
if(a==b) break;
a=a-b;
while(!a.pd()) a.div2();
}
for(int k=;k<=i;k++) a.mul2();
a.print();
} int main()
{
a.read(); b.read();
slove();
return ;
}

P2152 [SDOI2009]SuperGCD的更多相关文章

  1. P2152 [SDOI2009]SuperGCD 未完成

    辗转相减求a,b的gcd其实可以优化的: 1.若a为偶数,b为奇数:gcd(a,b)=gcd(a/2,b) 2.若a为奇数,b为偶数:gcd(a,b)=gcd(a,b/2) 3.若a,b都是偶数:gc ...

  2.  P2152 [SDOI2009]SuperGCD (luogu)

    Stein算法是一种计算两个数最大公约数的算法,是针对欧几里德算法在对大整数进行运算时,需要试商导致增加运算时间的缺陷而提出的改进算法. 算法思想: 由J. Stein 1961年提出的Stein算法 ...

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

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

  4. 洛谷 P2152 [SDOI2009]SuperGCD

    题意简述 求两个整数a,b的最大公约数0 < a , b ≤ 10 ^ 10000. 题解思路 如果 a % 2 == 0 && b % 2 == 0 gcd(a,b) = gc ...

  5. BZOJ 1876: [SDOI2009]SuperGCD

    1876: [SDOI2009]SuperGCD Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 3060  Solved: 1036[Submit][St ...

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

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

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

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

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

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

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

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

随机推荐

  1. ES索引瘦身 禁用_source后需要设置field store才能获取数据 否则无法显示搜索结果

    在默认情况下,开启_all和_source 这样索引下来,占用空间很大. 根据我们单位的情况,我觉得可以将需要的字段保存在_all中,然后使用IK分词以备查询,其余的字段,则不存储. 并且禁用_sou ...

  2. 如何解决GBK的编码的文件中的中文转换成为UTF-8编码的文件而且不乱码

    首先我们必须明确一点,为什么正常转换会乱码? 因为我们的数据写入是GBK写入的,然后展示的话是按照文件保存形势展示的,前面保存形势是GBK,一致,所以不乱码,而后面将保存形势变成了UTF-8,但是写入 ...

  3. (转)select、poll、epoll之间的区别总结[整理]

    select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作.但select ...

  4. redis cluster 实践总结

      最近项目接触到了redis cluster,现在趁着使用做一下总结,记录一下遇到过的问题,简单的概述一下常用到的命令和功能. 本篇文章主要是以运维的角度去讲述如何去更好的规划redis clust ...

  5. Money Systems

    链接 分析:来看看背包九讲里面的一段话: 对于一个给定了背包容量.物品费用.物品间相互关系(分组.依赖等) 的背包问题,除了再给定每个物品的价值后求可得到的最大价值外,还可以得 到装满背包或将背包装至 ...

  6. 【C++ Primer 5th】Chapter 15

    摘要: 1. 面向对象程序设计的核心思想是数据抽象.继承和动态绑定.数据抽象将类的接口和实现分离:继承定义相似的类型并对齐相似关系建模:动态绑定,在一定程度上忽略相似类型的区别,而以统一的方式使用它们 ...

  7. 【LeetCode】282. Expression Add Operators

    题目: Given a string that contains only digits 0-9 and a target value, return all possibilities to add ...

  8. BLE Mesh网络协议综述

    0 引言 自2012年蓝牙4.0规范推出之后,全新的蓝牙低功耗(BLE)技术由于其极低的运行和待机功耗.低成本和跨厂商互操作性,3 ms低延迟.AES-128加密等诸多特色,可以用于计步器.心律监视器 ...

  9. C++的函数重载与C参数个数不一致时的编译

    C++的函数重载意味着函数名和返回值类型相同,但是参数个数和/或类型不同.在编译过程中编译器一般会把各个参数的类型连接到函数名内组成新的函数名,以区分各个重载函数. C语言不支持函数重载.但是有时候虽 ...

  10. query builder 在线生成sql

    http://devtools.korzh.com/easyquery/javascript/docs/javascript-query-builder-php