[SDOI2009][BZOJ 1876]SuperGCD
Description
Input
Output
一行,表示A和B的最大公约数。
题解:
高精度
代码:
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
}
#define ll long long
#define MN 1255
#define Base 100000000
#define Width 8
char readin[MN*];
struct HPint{
ll s[MN],len;
void init(){memset(s,,sizeof s);len=;}
HPint operator =(ll num){
init();
for(;num>;){len++;s[len]=num%Base;num/=Base;}
return *this;
}
HPint operator =(const char *str){
init();
ll numlen=strlen(str);len=(numlen+Width-)/Width;
for(int i=numlen-,t=,w;i>=;i--,w*=){
if((numlen-i-)%Width==){w=;t++;}
s[t]+=w*(str[i]-);
}
return *this;
}
bool operator <(const HPint &a)const{
if(a.len!=len) return len<a.len;
for(int i=a.len;i>=;i--)if(a.s[i]!=s[i])return s[i]<a.s[i];
return ;
}
bool operator ==(const HPint &a)const{
return !(a<*this)&&!(*this<a);
}
HPint operator -(const HPint &a)const{
HPint ans;ans.init();ans.len=len;
for(int i=;i<=len;i++){
ans.s[i]+=s[i]-a.s[i];
if(ans.s[i]<){ans.s[i]+=Base;ans.s[i+]--;}
}
for(;ans.s[ans.len]==&&ans.len>;ans.len--);
return ans;
}
void MUL2(){
for(int i=;i<=len;i++)s[i]*=;len+=;
for(int i=;i<=len;i++){
s[i+]+=s[i]/Base;
s[i]%=Base;
}
for(;s[len]==&&len>;len--);
}
void DIV2(){
len+=;
for(int i=len;i>=;i--){
if(s[i]&)s[i-]+=Base;
s[i]/=;
}
for(;s[len]==&&len>;len--);
}
bool check(){
if(len==)return ;
else return s[]%==;
}
void read(){memset(readin,,sizeof(readin));scanf("%s",readin);*this=readin;}
void print(){
if(len==)printf("");
else{printf("%lld",s[len]);for(int i=len-;i>=;i--)printf("%08lld",s[i]);}
}
};
HPint a,b,res;
int cnt;
HPint gcd(HPint x,HPint y){
while(!(x==y)){
if(x<y)swap(x,y);
if(x.check()&&y.check()) x.DIV2(),y.DIV2(),cnt++;
else if(x.check()&&!y.check()) x.DIV2();
else if(!x.check()&&y.check()) y.DIV2();
else if(!x.check()&&!y.check()) x=x-y;
}
return x;
}
int main(){
a.read();b.read();
res=gcd(a,b);
while(cnt--) res.MUL2();
res.print();
return ;
}
来自PaperCloud的博客,未经允许,请勿转载,TKS!
[SDOI2009][BZOJ 1876]SuperGCD的更多相关文章
- BZOJ 1876 SuperGCD
Description Sheng bill有着惊人的心算能力,甚至能用大脑计算出两个巨大的数的GCD(最大公约数)!因此他经常和别人比赛计算GCD.有一天Sheng bill很嚣张地找到了你,并要求 ...
- BZOJ 1876: [SDOI2009]SuperGCD
1876: [SDOI2009]SuperGCD Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 3060 Solved: 1036[Submit][St ...
- bzoj 1876 [SDOI2009]SuperGCD(高精度+更相减损)
1876: [SDOI2009]SuperGCD Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 2384 Solved: 806[Submit][Sta ...
- BZOJ 1876: [SDOI2009]SuperGCD( 更相减损 + 高精度 )
更相减损,要用高精度.... --------------------------------------------------------------- #include<cstdio> ...
- BZOJ 1876 [SDOI2009] SuperGcd | PY好题
题面就是让你求两个超级大整数,求GCD 题解: 题目本意应该是出题人想考考高精度取膜 但是可以通过一种神奇的Stein算法来做 由J. Stein 1961年提出的Stein算法很好的解决了欧几里德算 ...
- 「BZOJ 1876」「SDOI 2009」SuperGCD「数论」
题意 求\(\gcd(a, b)\),其中\(a,b\leq10^{10000}\) 题解 使用\(\text{Stein}\)算法,其原理是不断筛除因子\(2\)然后使用更相减损法 如果不筛\(2\ ...
- bzoj 1876
传送门 http://www.lydsy.com/JudgeOnline/problem.php?id=1876 二进制gcd 学到了(' ' ) 高精还得压位,最开始没写压位,然后调了1h ...
- bzoj 1876 高精
首先我们知道,对于两个数a,b,他们的gcd情况有如下形式的讨论 当a为奇数,b为偶数的时候gcd(a,b)=gcd(a div 2,b) 当b为奇数,a为偶数的时候gcd(a,b)=gcd(a,b ...
- [SDOI2009][BZOJ 1226]学校食堂
Description 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人的口味都可以 ...
随机推荐
- sourceTree 3.X免注册[学习]
一. 在路径C:\****\AppData\Local\Atlassian\SourceTree下创建accounts.json文件 [ { "$id": "1" ...
- iOS 10.0前的Notification推送
前言 推送为远程推送,一般由苹果APNS服务器发送给苹果设备(iPhone,iPad) 推送分在前台和后台.在前台时 用户可以在application 的代理回调接口中做相应处理:在后台时 系统会全权 ...
- LAMP环境搭建之编译安装指南(php-5.3.27.tar.gz)
测试环境:CentOS release 6.5 (Final) 软件安装:httpd-2.2.27.tar.gz mysql-5.1.72.tar.gz php-5.3.27.tar.gz 1 ...
- Crypto模块中的签名算法
因为支付宝当中需要自行实现签名,所以就用到了SHA265和RSA2,将拼接好的信息用私钥进行签名,并进行Base64编码,然后解密就用支付宝回传给用户的公钥解密就ok了,所以我就使用Crypto模块, ...
- c# Unicode
- git rebase 版本。。变基
git rebase,顾名思义,就是重新定义(re)起点(base)的作用,即重新定义分支的版本库状态.要搞清楚这个东西,要先看看版本库状态切换的两种情况: 我们知道,在某个分支上,我们可以通过git ...
- SpringCloud_Eureka与Zookeeper对比
关系型数据库与非关系型数据库及其特性: RDBMS(Relational Database Management System 关系型数据库) :mysql/oracle/sqlServer等 = ...
- GooglePlay测试支付遇到的问题
推荐谷歌安装器,可以方便地安装谷歌框架及服务 问题列表 1.测试支付时出现:需要验证身份.您需要登录自己google账号 解决:我是使用VPN,VPN地区是日本,但我在google后台设置的发布(下载 ...
- linux 非root用户安装nginx
第一步:首先下载依赖包 下载地址 pcre(www.pcre.org),zlib(www.zlib.org),openssl(www.openssl.org) 第二步:上传那个nginx的安装包 下载 ...
- (一)WCF基础
我们近期在做项目的时候用到了WCF,之前已经看了部分视频,对于WCF有了一定的了解,但仅限于能够根据搭建好的框架使用WCF,还不了解.所以就进行了研究,这样既有实践也能增加理论,二者结合,使用起来更胜 ...