双六

一个双六上面向前向后无限延续的格子,每个格子都写有整数,其中0号格子是起点。1号格子是终点。而骰子上只有a,b,-a,-b四个整数,所以根据a和Bb的值得不同,有可能无法到达终点。
掷出4个整数各多少次可以到达终点呢?如果解不唯一输出任意一组几个,如果无解输出-1。
样例
输入
4 11
输出
3 1
这个问题用数学语言表述就是“求整数x和y使得ax+by=1”。可以发现,如果gcd(a,b≠1,显然无
解。反之,如果gcd(a,b)=1,就可以通过扩展原来的辗转相除法来求解。事实上,一定存在整数对(x,y)使得ax+by=gcd(a,b),并可以用同样的算法求得。设 int extgcd(inta,intb,int&x,int&y)是求解该方程的函数,其返回值是gcd(a,b与gcd一样,我们可以递归地定义 extged。
假设已经求得了
**(a%b)y’=gcd(a, b)
的整数解x和y。再将
a%b=a-(alb)xb
代入后就得到
ay’+b(x’-()xy)=gcd(a, b
而当b=0时则有
a×1+b0=a=gcd(a,b)
将上述数学语言转化成代码后,就得到了如下程序。
**

#include<iostream>
#include<cstdio>
using namespace std;
int gcd(int a, int b)//递归辗转相除法求两个数的最大公因数
{if (b == 0)return a;elsereturn gcd(b, a % b);
}
void ex_gcd(int a, int b, int& x, int& y)//&是引用,不是地址
{if (b == 0){x = 1;y = 0;return;}else{ex_gcd(b, a % b, x, y);int t = x;x = y;y = t - (a / b) * y;}
}
int main()
{int a, b, x, y;cin >> a >> b;ex_gcd(a, b, x, y);if (gcd(a, b) != 1)cout << -1 << endl;else{cout << x << " " << y << endl;}return 0;
}

ax+by=gcd(a,b)的解的大小

只要看一下递归的方法就能知道, extged的复杂度和gcd的复杂度是相同的。但该函数所求的
ax+by=gcd(a,b)的解的大小又如何呢?
事实上如果ab≠0,可以知道x≤b且y≤a下面用归纳法来证明这一结论。在b=0的前一步,即a%b=0时有x=0且y=1,结论显然成立。
假设调用 extgcd(b,a%b,y,x)后有x≤b且ly1≤a%b。
在 extgcd(a,b,x,y)中x=xy=y-(ab)x,所以有如下不等式成立。=≤b,y=y(ab)x≤y+(ab)xx1≤a%b+(a/b)×b=a

扩展欧几里得算法之双六问题相关推荐

  1. 扩展欧几里得算法(双六游戏)

    题目大意:一个双六上面有向前 向后无限延续的格子, 每个格子都写有整数.其中0号格子是起点,1号格子 是终点.而骰子上只有a,b,-a,-b四个整数,所以根据a和b的值的不同,有可能无法到达终点 掷出 ...

  2. 欧几里得算法和扩展欧几里得算法(Euclidean_Algorithm and Extended_Euclidean_Algorithm)

    一.基本概念 欧几里得算法:又名辗转相除法,计算两个整数a,b的最大公约数. 扩展欧几里得算法:对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ...

  3. 扩展欧几里得算法_扩展欧几里得递推算法

    欧几里得算法 表示 整数 a 与 b 的最大公约数. 若 t = a % b, 则 证明略. 递推版 gcd 算法 gcd 接受变量元组 (a, b) 作为输入,输出最大公约数 (r). 我们很难直接 ...

  4. 欧几里得算法扩展欧几里得算法

    欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). ...

  5. 如何利用扩展欧几里得算法求解不定方程_客户端不用的算法系列:从头条笔试题认识扩展欧几里得算法...

    难度较高,阅读时间大概 28 分钟 这是数论的第二篇,在<素数筛法>中,我们重温了素数这个数学定义,并且给出了区别于教科书上更高效的 Eratosthenes 筛法和欧拉线性筛.这篇文会从 ...

  6. Codeforces 1106F Lunar New Year and a Recursive Sequence (数学、线性代数、线性递推、数论、BSGS、扩展欧几里得算法)...

    Codeforces 1106F Lunar New Year and a Recursive Sequence (数学.线性代数.线性递推.数论.BSGS.扩展欧几里得算法) 哎呀大水题..我写了一 ...

  7. POJ 1061 BZOJ 1477 Luogu P1516 青蛙的约会 (扩展欧几里得算法)

    POJ 1061 BZOJ 1477 Luogu P1516 青蛙的约会 (扩展欧几里得算法) 手动博客搬家: 本文发表于20180226 23:35:26, 原地址https://blog.csdn ...

  8. GCD LCM 欧几里得算法 扩展欧几里得算法

    欧几里得算法: 辗转相除法的关键恒等式:gcd(a,b)=gcd(b,a mod b); 边界条件:gcd(a,0)=a; //最大公约数 int gcd(int a,int b) {return b ...

  9. 2018/7/31 -zznu-oj -问题 C: 磨刀- 【扩展欧几里得算法的基本应用】

    问题 C: 磨刀 时间限制: 1 Sec  内存限制: 128 MB 提交: 190  解决: 39 [提交] [状态] [讨论版] [命题人:admin] 题目描述 磨刀是一个讲究的工作,只能在n℃ ...

最新文章

  1. 计算程序运行时间(time_t, clock_t)
  2. Vi非正常退出导致敏感信息泄露
  3. LeetCode-77-Combinations
  4. 从csv文件批量创建AD用户,带源码。
  5. 【问底】严澜:数据挖掘入门——分词
  6. 2007年教育学专业基础综合考试大纲
  7. java单例模式几种实现方式
  8. td不允许自己扩展_一定要抱着大A不放手吗?
  9. 产品战略规划十步法ppt_从管理咨询角度谈如何系统地做产品战略规划?
  10. java gzip rest_RestTemplate与Gzip压缩
  11. java api es_ES 常用java api
  12. 良好的开端是成功的第一步———构建程序
  13. solrcloud 7.5在k8s上的部署安装和使用教程
  14. 安装Ubuntu镜像和VMware在安装Ubuntu镜像之后开机蓝屏的解决方案
  15. 【Hadoop学习笔记】大数据框架原理及主要工具概述
  16. 程序员首先要能坐得住
  17. .net core Fleck WebSocket使用笔记
  18. 粤通院 招聘FPGA工程师
  19. 兼容iOS 10 _升级xcode8_适配(四)
  20. vscode之vue-cli安装和vue项目搭建

热门文章

  1. C语言函数fscanf()(从流 stream 读取格式化输入)(如果成功,返回成功匹配和赋值的个数;否则返回EOF)(分隔符:space、Tab、Enter)
  2. linux运行脚本报错:/bin/bash^M: bad interpreter: No such file or directory(dos2unix )(/bin/sh^M)(回车符、换行符)
  3. 【编译原理】构建一个简单的解释器(Let’s Build A Simple Interpreter. Part 7.)(笔记)解释器 interpreter 解析器 parser 抽象语法树AST
  4. php中0与NULL,False,“0”,\0的区别
  5. 部署连接阿里云单体redis5.0
  6. c语言编程后总有一个错误,C语言编程,之后出现错误,请大神帮忙看下什么问题?...
  7. python ocr 识别中文pdf_轻松识别文字,这款Python OCR库支持超过80种语言
  8. Elasticsearch 常见的DSL语法
  9. dom定义了访问html文档对象的,HTML DOM (文档对象模型)
  10. python添加系统环境win7_python环境配置(基于win7 x64)