博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【题解】 P2152 [SDOI2009]SuperGCD
阅读量:6583 次
发布时间:2019-06-24

本文共 2668 字,大约阅读时间需要 8 分钟。

\(Description:\)

写高精的\(gcd(a,b)\)

\(Sample\) \(Input\):

12

54

\(Sample\) \(Output\)

6

题意简介明了,然而代码。。。很长。。。。。。。。。。。。

一开始单纯的以为可以直接高精过,用更相减损术做gcd,结果wei大了。

敲了一个压了八位的高精,又wei了。

我开始思考。。。

事实证明我得写正解?

(事实是我重载小于号时是从前往后判的。。。。。

但是无知的我开始看题解:

对于更相减损术的优化:

  • a是偶数,b是偶数 那么\(gcd(a,b)=gcd(a/2,b/2)*2\)

  • a是偶数,b是奇数 那么\(gcd(a,b)=gcd(a /2,b)\)

  • a是奇数,b是偶数 那么\(gcd(a,b)=gcd(a,b/2)\)

证明:(我喜欢口糊,大量文字注意!!!

  • 1->显然
  • 2->显然
  • 3->显然

大量文字。。。。。。

其实都挺好理解的,那么知道了这三条性质,就可以优化了

时间复杂度

\(O(我不知道)\)

这是什么神仙复杂度。。。。。。

附上写了一个晚上的高精。。。

#include
#define int long longusing namespace std;const int MAXN=100000,B=100000000,MAXM=3000;int A[MAXN+5];namespace Huge_int { using namespace std; struct huge_int { int n; int a[MAXM+5]; inline void clear() { memset(a,0,sizeof(a));n=0; } inline void work() { while(n>1 && !a[n]) n--; } inline huge_int rd() { memset(A,0,sizeof(A)); clear(); char ch=getchar(); while(ch<'0' || ch>'9') ch=getchar(); while(ch<='9' && ch>='0') A[++n]=ch-'0',ch=getchar(); for(int i=1;i+i<=n;++i) swap(A[i],A[n-i+1]); for(int i=1;i<=n;i+=8){ int j=(i+7)/8; a[j]=(A[i]+A[i+1]*10+A[i+2]*100+A[i+3]*1000+A[i+4]*10000+A[i+5]*100000+A[i+6]*1000000+A[i+7]*10000000); } n=(n+7)/8; return *this; } inline huge_int wrt() const { printf("%lld",a[n]); for(int i=n-1;i>=1;--i) printf("%08lld",a[i]); putchar('\n'); return *this; } inline bool operator < (const huge_int &nt) const { if(n
nt.n) return 0; for(int i=n;i>=1;--i) if(a[i]!=nt.a[i])return a[i]
(const huge_int &nt) const { return nt<*this; } inline bool operator != (const huge_int &nt) const { return (*this
=1;--i){ x=x*B+a[i]; tmp.a[i]=x/nt; x%=nt; } tmp.work(); return tmp; } inline huge_int operator += (const huge_int &nt) { return *this=*this+nt; } inline huge_int operator -= (const huge_int &nt) { return *this=*this-nt; } inline huge_int operator *= (const huge_int &nt) { return *this=*this*nt; } inline huge_int operator /= (const int &nt) { return *this=*this/nt; } }; inline huge_int gcd(huge_int a,huge_int b) { int na=0,nb=0; while(!(a.a[1]&1)) na++,a/=2; while(!(b.a[1]&1)) nb++,b/=2; int x=min(na,nb); while(a!=b){ if(a

转载于:https://www.cnblogs.com/JCNL666/p/10645329.html

你可能感兴趣的文章
StringUtils方法全集介绍
查看>>
性能调校
查看>>
VMware workstation虚拟网卡类型介绍
查看>>
C# web 更新折腾记
查看>>
Android5.1.1源码 - zygote fork出的子进程如何权限降级
查看>>
【转】红帽 Red Hat Linux相关产品iso镜像下载【迅雷快传】【百度云】【更新7.1】...
查看>>
IBM主机巡检操作文档
查看>>
zabbix企业应用之Mysql主从监控
查看>>
移动端iphone按下a链接背景颜色会变灰
查看>>
使用JSoup+CSSPath采集和讯网人物信息
查看>>
如何识别 MacBook Pro 机型
查看>>
javascript 图标分析工具
查看>>
深入分析Docker镜像原理
查看>>
从结构struct谈到类class(基于C++实现)
查看>>
Python3环境配置
查看>>
Maximum_Subarray --leetcode
查看>>
利用网络准入把好企业网入网第一道关
查看>>
阿里云负载均衡服务
查看>>
小命令 sysdig
查看>>
IT十八掌作业_java基础第五天_静态代码块、类的继承和接口
查看>>