更相减损法:gcd(a,b)=gcd(a/2,b/2)∗2gcd(a,b)=gcd(a/2,b/2)∗2gcd(a,b) = gcd(a/2, b/2)*2 当a,b均为偶数
gcd(a,b)=gcd(a/2,b)gcd(a,b)=gcd(a/2,b)gcd(a,b) = gcd(a/2,b) 当仅有a为偶数
gcd(a,b)=gcd(a,b/2)gcd(a,b)=gcd(a,b/2)gcd(a,b) = gcd(a,b/2) 当仅有b为偶数
gcd(a,b)=gcd(max(a,b)−min(a,b),min(a,b))gcd(a,b)=gcd(max(a,b)−min(a,b),min(a,b))gcd(a,b) = gcd(max(a,b) - min(a,b), min(a,b)) 当其中一个参数为0时,另外一个参数即为答案

/**************************************************************Problem: 1876User: YJMSTRLanguage: C++Result: AcceptedTime:1500 msMemory:840 kb
****************************************************************/#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define Max(_A,_B) (_A>_B?_A:_B)
#define Min(_A,_B) (_A<_B?_A:_B)
int read(){int s = 0;bool f = 1;char c = getchar();while(c > '9' || c < '0'){if(c == '-') f = 0; c = getchar();}while(c >= '0' && c <= '9') {s = s * 10 + c - '0';c = getchar();}return f == 1 ? s : -s;
}
typedef long long ll;
const int base = 100000000, bit = 8, maxn = 1255;
int n;
char s[10007];
struct bign{int a[maxn], len;void sub(bign b) {  //减bfor (int i = 1; i <= 1200; i++) {if(i <= b.len) a[i] -= b.a[i];if(a[i] < 0) {a[i] += base;a[i + 1]--;}}while(!a[len] && len) len--;}void div() {//自除2for (int i = 1; i <= len; i++) {if(a[i]&1) a[i - 1] += base >> 1;   //只有偶数情况才会用到div,所以不用考虑末位是奇数的情况a[i] >>= 1;}while(!a[len]) len--;}void mul() {    //自乘2for (int i = len; i >= 1; i--) {a[i] <<= 1; a[i + 1] += a[i]/base, a[i] %= base;}while(a[len + 1]) len++;}void operator =(char *str) {int l = strlen(str + 1);len = l % bit ? l / bit + 1 : l / bit;for (int i = 1; i <= len; i++) {int s = Max(1, l - i * bit + 1);int t = l - (i - 1) * bit;for (int j = s; j <= t; j++) a[i] = a[i] * 10 + str[j] - '0';}}void print() {while(!a[len]) len--;for (int i = len; i >= 1; i--) {if(i == len) printf("%d", a[i]);else printf("%08d", a[i]);}}bool operator>(bign b) {if(len < b.len) return false;if(len > b.len) return true;for (int i = len; i >= 1; i--) {if(a[i] > b.a[i]) return true;if(a[i] < b.a[i]) return false;}return true;}
}a, b;
int main() {// n = read();scanf("%s", s+1);a = s;scanf("%s", s+1);b = s;int g = 0;for(;;){if((a.a[1]&1)==0&&(b.a[1]&1)==0) {a.div(); b.div(); g++;}else if((a.a[1]&1)==0) a.div();else if((b.a[1]&1)==0) b.div();if(a > b){a.sub(b);if(!a.len){while(g--) b.mul();b.print();return 0;}}else{b.sub(a);if(!b.len){while(g--) a.mul();a.print();return 0;}}}return 0;
}

BZOJ1876:[SDOI2009]SuperGCD 高精度+更相减损法相关推荐

  1. 最详细最简单:最大公因数求法、辗转相除法、更相减损法,入门ACM,杭电水题,算法递归,初级算法题一看就懂

    文章目录 前言 一.名称定义 1.最大公约数 2.辗转相除法 3.更相减损法 二.ACM杭电入门题 1.解题思路 三.解题参考代码(C语言,C++) 0.最优算法(C++) 1.辗转相除求解(C语言) ...

  2. 辗转相除法+更相减损法求最大公约数

    怎么求两个数的最大公约数呢? 简单的想法就是直接暴力枚举,试出最大公约数 #暴力枚举 #暴力枚举 def GCD(numberA,numberB):gcd=1for i in range(2,max( ...

  3. 辗转相除法和更相减损法原理和算法

    辗转相除法: 现在需要去求解a和b的最大公约数k.可知a=m*k,b=n*k,a=t*b+r 之后带a=m*k,b=n*k到a=q*k+r中r=(m-n*t)*k所以可知gcb(a,b)=gcb(b, ...

  4. 更相减损法求最大公因数

    问题描述 在之前的博客中提到使用辗转相除法求最大公约数的方法,现在介绍另外一种更容易理解的方法--更相减损法 算法思想 Created with Raphaël 2.2.0 开始 确认? 结束 我的操 ...

  5. 更相减损法一定要约分吗_如何回应利润分成要约

    更相减损法一定要约分吗 You've heard it many, many times before. A client (or potential client) approaches you w ...

  6. 更相减损法java代码_Python基于更相减损术实现求解最大公约数的方法

    本文实例讲述了Python基于更相减损术实现求解最大公约数的方法.分享给大家供大家参考,具体如下: 先从网上摘录一段算法的描述如下: 更相减损法:也叫 更相减损术,是出自< 九章算术>的一 ...

  7. C语言实现辗转相除法和更相减损法求两数最大公约数,及求最小公倍数的方法

    在学习从C语言过程中,我们会遇到一个题目,求两个整数的最大公约数,那么接下来分别介绍两种方法求最大公约数 1,辗转相除法 辗转相除法, 又名欧几里德算法(Euclidean Algorithm),是求 ...

  8. C:求两个数的最大公约数详解(硬核算法,辗转相除法,更相减损法)

    最大公因数,也称最大公约数.最大公因子. 定义: 指两个或多个整数共有约数中最大的一个. a,b的最大公约数 记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有 ...

  9. 求最大公约数与最小公倍数 (辗转相除法+更相减损法+Stein算法)

    辗转相除法与更相减损法对比: (1)两者都是求最大公因数的方法,计算上辗转相除法以除法为主,更相减损术以减法为主,计算次数上辗转相除法计算次数相对较少,特别当两个数字大小区别较大时计算次数的区别较明显 ...

最新文章

  1. poj 2288 Islands and Bridges_状态压缩dp_哈密尔顿回路问题
  2. BZOJ2169 连边(动态规划)
  3. js 数组、对象转json 以及json转 数组、对象
  4. ActiveServices
  5. vs2013 未将对象引用设置到对象的实例
  6. 斗地主你什么时候才会托管?(.NET中的托管于非托管)
  7. HBase编程 API入门系列之create(管理端而言)(8)
  8. 第一册:lesson forty three。
  9. linux容器安装crontab
  10. win10树莓派改ip_用树莓派制作温湿度服务器
  11. 栈和队列的应用(迷宫问题)
  12. 服务器托管费用怎么计算?
  13. import * as用法
  14. 产品需求文档怎样编写
  15. 2.Button按钮实例:普通按钮和图片按钮
  16. fatal: does not appear to a git repository
  17. [MATLAB]b样条方程基函数方程的表达式, 及n阶基函数作图
  18. Scratch创作-从入门到精通
  19. linux内核中linux中readl()和writel()函数---用于读写寄存器
  20. 马少平、周枫、王小川、楼天城、唐文斌……清华计算机系与AI的40年

热门文章

  1. 84 - 哪一个小朋友不用表演节目
  2. 让你爱不释手的Mac软件
  3. BI Publisher论坛
  4. 【统计学】贝叶斯推理方法
  5. 整合MyBatis操作 注解模式 混合模式
  6. 【记录点滴】StringEscapeUtils.unescapeHtml与StringEscapeUtils.escapeHtml4使用
  7. TCP三次握手相关面试题
  8. upc 8377: Playoff(搜索-dfs)
  9. Mobox企业云存储的过去与未来
  10. MPTCP 源码分析(一) MPTCP的三次握手