二进制GCD算法解析
UPD 2018.3.30 这个好像就是更相减损术的样子emmm
UPD 2018.5.22 好像不是更相减损术而是叫Stein算法的样子emmm
蒟蒻来做个二进制GCD笔记。
为什么要写这个东西呢,因为按照ysy神犇在这次luogu夏令营的说法,常数会小很多。
我再查了一下(ysy神犇没说实现啊orz),这玩意的原理说起来大概是这样的:
因为普通的辗转相除法求gcd需要用到取模,所以常数比较慢。
我们使用另一种算法:
求gcd(a,b)。有三种情况:
1.a,b为偶数,则gcd(a,b)=2*gcd(a/2,b/2)
2.a为奇数,b为偶数,则gcd(a,b)=gcd(a,b/2)
3.a,b为奇数。假设a>=b,则gcd(a,b)=gcd((a-b)/2,b)
4.a为0,则返回b
然后以上的除法和判奇偶性可以使用位运算处理。
取较大值可以使用内联函数降低常数。
然后....emmm
下面是两种算法的执行时间。原题:BZOJ 入门P1234

可能是范围开的不够大?(一脸懵逼)
然后我自己测了一组比较大的数据。
9223372036854775800 529215046068469760
每个程序运行5次,忽略误差较大的运行,取平均值,得到的数据如下:
普通gcd算法:13.576ms
二进制gcd算法:13.044ms
总之...emm,掌握还是很简单的。
至于什么时候用...各位见仁见智吧。
代码如下:
#include<iostream>
using namespace std;
typedef long long ll;
inline ll abs(ll x){
return x<?-x:x;
}
inline ll min(ll a,ll b){
return a<b?a:b;
}
inline ll gcd(ll a,ll b){
if(a==)return b;
if(b==)return a;
if(!(a&)&&!(b&))return *gcd(a>>,b>>);
else if(!(a&))return gcd(a>>,b);
else if(!(b&))return gcd(a,b>>);
else return gcd(abs(a-b),min(a,b));
} int main(){
ll a,b;
cin>>a>>b;
cout<<"gcd="<<gcd(a,b);
return ;
}
二进制GCD算法解析的更多相关文章
- 二进制GCD算法 减少%的时间消耗
/* 二进制求最大公约数.由于传统的GCD,使用了%,在计算机运行过程中要花费大量的时间,所以,采取二进制的求法,来减少时间的消耗. 算法: 当a,b都是偶数时: gcd(a,b)=2*gcd(a/2 ...
- 【数论】二进制GCD
二进制GCD GCD这种通用的算法相信每个OLER都会 ,辗转相除,代码只有四行 : int GCD(int a,int b){ if(b==0) return a; return GCD(b ...
- 不同的GCD算法
分类: C语言程序2014-10-08 15:10 28人阅读 评论(0) 收藏 举报 gcdC语言程序位运算 早在公元前300年左右,欧几里得就在他的著作<几何原本>中给出了高效的解法- ...
- Android逆向之旅---Android中锁屏密码算法解析以及破解方案
一.前言 最近玩王者荣耀,下载了一个辅助样本,结果被锁机了,当然破解它很简单,这个后面会详细分析这个样本,但是因为这个样本引发出的欲望就是解析Android中锁屏密码算法,然后用一种高效的方式制作锁机 ...
- 区块链~Merkle Tree(默克尔树)算法解析~转载
转载~Merkle Tree(默克尔树)算法解析 /*最近在看Ethereum,其中一个重要的概念是Merkle Tree,以前从来没有听说过,所以查了些资料,学习了Merkle Tree的知识,因为 ...
- 地理围栏算法解析(Geo-fencing)
地理围栏算法解析 http://www.cnblogs.com/LBSer/p/4471742.html 地理围栏(Geo-fencing)是LBS的一种应用,就是用一个虚拟的栅栏围出一个虚拟地理边界 ...
- gcd和拓展gcd算法
gcd算法是用来求两个数最大公约数的算法,他是依靠辗转相除(中国好像叫辗转相减)法来求两个数的最大公约数,别的地方也有很多介绍不做过多赘述,主要提供代码供自己参考. gcd(int a,int b) ...
- KMP串匹配算法解析与优化
朴素串匹配算法说明 串匹配算法最常用的情形是从一篇文档中查找指定文本.需要查找的文本叫做模式串,需要从中查找模式串的串暂且叫做查找串吧. 为了更好理解KMP算法,我们先这样看待一下朴素匹配算法吧.朴素 ...
- Peterson算法与Dekker算法解析
进来Bear正在学习巩固并行的基础知识,所以写下这篇基础的有关并行算法的文章. 在讲述两个算法之前,需要明确一些概念性的问题, Race Condition(竞争条件),Situations lik ...
随机推荐
- .Net使用Redis详解之ServiceStack.Redis(7)
Net使用Redis详解之ServiceStack.Redis(七) 序言 本篇从.Net如何接入Reis开始,直至.Net对Redis的各种操作,为了方便学习与做为文档的查看,我做一遍注释展现,其中 ...
- 网关-zuul介绍 第一篇 网关解决的问题
基于网关,我们可以实现 限流,认证,监控,路由 等功能,这样说,我们可能觉得很生硬,那我们反过来推一下, 假如没有网关会怎么样?1 :客户端需要访问多个后端服务,则前端得存储多个后端的地址(ip+po ...
- String类的编码和解码问题
我们前面知道同一个字符在利用不同的编码表得到的结果一般是不一样的. 这里讨论个字符串的编码和解码问题 字符串的一些方法: String(byte[] b,Charset charset); Strin ...
- vue.js 源代码学习笔记 ----- instance init
/* @flow */ import config from '../config' import { initProxy } from './proxy' import { initState } ...
- uglify-es 解决webpack 不能压缩es6 的问题
https://www.npmjs.com/package/uglify-es
- SSH服务及其扩展(sshpass和expect)
SSH服务及其扩展(sshpass和expect) Linux SSH服务一共包含三个工具:ssh.scp.sftp [远程连接及执行命令] 语法:ssh -p端口 账号@IP 命令 参数说明:-o ...
- 【集成学习】sklearn中xgboost模块中plot_importance函数(绘图--特征重要性)
直接上代码,简单 # -*- coding: utf-8 -*- """ ################################################ ...
- Could not load the "light_rain.png" image referenced from a nib in the bundle with identifier
导入图片文件夹的时候勾选create groups
- linux下导入、导出mysql 数据库命令
一.导出数据库用mysqldump命令(注意mysql的安装路径,即此命令的路径):1.导出数据和表结构:mysqldump -u用户名 -p密码 数据库名 > 数据库名.sql#/usr/lo ...
- 【Codeforces】Round #491 (Div. 2) 总结
[Codeforces]Round #491 (Div. 2) 总结 这次尴尬了,D题fst,E没有做出来.... 不过还好,rating只掉了30,总体来说比较不稳,下次加油 A:If at fir ...