题目大意:一个双六上面有向前 向后无限延续的格子, 每个格子都写有整数。其中0号格子是起点,1号格子
是终点。而骰子上只有a,b,-a,-b四个整数,所以根据a和b的值的不同,有可能无法到达终点
掷出四个整数各多少次可以到达终点呢?如果解不唯一,输出任意一组即可。如果无解 输出-1

思路:这道题用数学方法表述就是求整数x和y使得“ax+by=1",可以发现,如果gcd(a,b)不等于1,显然无解。 反之,则可以用扩展欧几里得算法来求解。  事实上,一定存在整数对(x,y)使得ax+by=gcd(a,b)

具体看代码:

#include<iostream>
#include<string.h>
#include<map>
#include<cstdio>
#include<cstring>
#include<stdio.h>
#include<cmath>
#include<math.h>
#include<algorithm>
#include<set>
#include<queue>
typedef long long ll;
using namespace std;
const ll mod=1e9+7;
const int maxn=1e3+10;
const int maxk=5e3+10;
const int maxx=1e4+10;
const ll maxe=1000+10;
#define INF 0x3f3f3f3f3f3f
#define Lson l,mid,rt<<1
#define Rson mid+1,r,rt<<1|1
int extgcd(int a,int b,int &x,int &y)//这里才是关键所在
{int d=a;//d 是最大公约数if(b!=0){d=extgcd(b,a%b,y,x);//之前一直在想为什么为什么是这样的,想了很久,下面看解释/*刚开始是ax+by=gcd(a,b),但是按照这个算法来的话,下一步就变成了bx'+(a%b)y'=gcd(a,b)a%b=a-a/b*b,代入上面方程得到 ay'+b(x'-a/b*y')=gcd(a,b)   其实这里的y'=x,x'=y所以可以得到x=y'   y=y-(a/b*x) */y-=a/b*x;}else{x=1;y=0;}return d;//每次都是返回最大公约数
}
int main()
{int a,b,x,y;int ans[4]={0};cin>>a>>b;if(extgcd(a,b,x,y)!=1)cout<<"-1"<<endl;else{if(x<0) ans[2]=-x;else ans[0]=x;if(y<0) ans[3]=-y;else ans[1]=y;for(int i=0;i<4;i++)cout<<ans[i];cout<<endl;}return 0;
}

转载于:https://www.cnblogs.com/caijiaming/p/9429239.html

扩展欧几里得算法(双六游戏)相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 扩展欧几里得算法 POJ 1061

    根据此题 整理下 扩展欧几里得 扩展欧几里得是用来判断并求 ax + by = c 是否有解及其解的数学算法 首先列出定理 1.ax + by = gcd(a,b) 2.gcd(a,b) = gcd( ...

最新文章

  1. sturts2 单上传、多上传、下载例子
  2. 浅谈网络协议(一) 为什么要学网络协议
  3. Java基础知识:IO
  4. 监视和管理GlassFish 3的多种方法
  5. [html] 写一个布局,当页面滚动一定高时,导航始终固定在顶部,反之恢复原位
  6. 错误记录(四)java.lang.IllegalArgumentException: Control character in cookie value or attribute.
  7. ssis 计划任务_SSIS Web服务任务
  8. 一款PO VO DTO 转换神器,求求你别在到处找工具类了!
  9. SQL夯实基础(九)MySQL联接查询算法
  10. 第四课曲面与曲线方程
  11. 一步一步构建手机WebApp开发——页面布局篇
  12. 使用 dlopen 和 dlsym 来使用 C++ 中的函数、类
  13. RSI的交易系统以及用rsi指标进行探势
  14. 前摩拜创始人出任百度造车CEO
  15. SQL语句的约束条件
  16. 2021全球与中国视频编辑软件市场现状及未来发展趋势
  17. 全国职业技能计算机考试教案,内江职业技术学院2017年中职类—信息技术二类技能测试大纲...
  18. 插件化中Activity的加载
  19. java socket一直得不到返回值
  20. 如何在excel中导入记事本中的数据

热门文章

  1. Metro UI 的设计感悟
  2. ASP用正则验证邮箱地址手机号码电话号码格式
  3. 转载:Prototype.js的中文使用手册
  4. Zuul转发请求时HttpHostConnectException can‘t cast to ZuulException问题解决方法
  5. 手机锁屏js倒计时停止问题解决办法探索
  6. 【报告分享】2022中国职业教育行业报告-多鲸资本.pdf(附下载链接)
  7. 推荐系统之粗排扮演的角色和算法发展历程
  8. 【干货】2020顶级数据团队建设全景报告-清华大学.pdf(附下载链接)
  9. 【报告分享】2019网红电商生态发展白皮书.pdf
  10. 搜索算法-三个简单的小问题