BZOJ1876:[SDOI2009]SuperGCD 高精度+更相减损法
更相减损法: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 高精度+更相减损法相关推荐
- 最详细最简单:最大公因数求法、辗转相除法、更相减损法,入门ACM,杭电水题,算法递归,初级算法题一看就懂
文章目录 前言 一.名称定义 1.最大公约数 2.辗转相除法 3.更相减损法 二.ACM杭电入门题 1.解题思路 三.解题参考代码(C语言,C++) 0.最优算法(C++) 1.辗转相除求解(C语言) ...
- 辗转相除法+更相减损法求最大公约数
怎么求两个数的最大公约数呢? 简单的想法就是直接暴力枚举,试出最大公约数 #暴力枚举 #暴力枚举 def GCD(numberA,numberB):gcd=1for i in range(2,max( ...
- 辗转相除法和更相减损法原理和算法
辗转相除法: 现在需要去求解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, ...
- 更相减损法求最大公因数
问题描述 在之前的博客中提到使用辗转相除法求最大公约数的方法,现在介绍另外一种更容易理解的方法--更相减损法 算法思想 Created with Raphaël 2.2.0 开始 确认? 结束 我的操 ...
- 更相减损法一定要约分吗_如何回应利润分成要约
更相减损法一定要约分吗 You've heard it many, many times before. A client (or potential client) approaches you w ...
- 更相减损法java代码_Python基于更相减损术实现求解最大公约数的方法
本文实例讲述了Python基于更相减损术实现求解最大公约数的方法.分享给大家供大家参考,具体如下: 先从网上摘录一段算法的描述如下: 更相减损法:也叫 更相减损术,是出自< 九章算术>的一 ...
- C语言实现辗转相除法和更相减损法求两数最大公约数,及求最小公倍数的方法
在学习从C语言过程中,我们会遇到一个题目,求两个整数的最大公约数,那么接下来分别介绍两种方法求最大公约数 1,辗转相除法 辗转相除法, 又名欧几里德算法(Euclidean Algorithm),是求 ...
- C:求两个数的最大公约数详解(硬核算法,辗转相除法,更相减损法)
最大公因数,也称最大公约数.最大公因子. 定义: 指两个或多个整数共有约数中最大的一个. a,b的最大公约数 记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有 ...
- 求最大公约数与最小公倍数 (辗转相除法+更相减损法+Stein算法)
辗转相除法与更相减损法对比: (1)两者都是求最大公因数的方法,计算上辗转相除法以除法为主,更相减损术以减法为主,计算次数上辗转相除法计算次数相对较少,特别当两个数字大小区别较大时计算次数的区别较明显 ...
最新文章
- poj 2288 Islands and Bridges_状态压缩dp_哈密尔顿回路问题
- BZOJ2169 连边(动态规划)
- js 数组、对象转json 以及json转 数组、对象
- ActiveServices
- vs2013 未将对象引用设置到对象的实例
- 斗地主你什么时候才会托管?(.NET中的托管于非托管)
- HBase编程 API入门系列之create(管理端而言)(8)
- 第一册:lesson forty three。
- linux容器安装crontab
- win10树莓派改ip_用树莓派制作温湿度服务器
- 栈和队列的应用(迷宫问题)
- 服务器托管费用怎么计算?
- import * as用法
- 产品需求文档怎样编写
- 2.Button按钮实例:普通按钮和图片按钮
- fatal: does not appear to a git repository
- [MATLAB]b样条方程基函数方程的表达式, 及n阶基函数作图
- Scratch创作-从入门到精通
- linux内核中linux中readl()和writel()函数---用于读写寄存器
- 马少平、周枫、王小川、楼天城、唐文斌……清华计算机系与AI的40年