博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
扩展欧几里德
阅读量:7209 次
发布时间:2019-06-29

本文共 930 字,大约阅读时间需要 3 分钟。

例题 双六游戏

一个双六上面有向前 向后无限延续的格子, 每个格子都写有整数。其中0号格子是起点,1号格子

是终点。而骰子上只有a,b,-a,-b四个整数,所以根据a和b的值的不同,有可能无法到达终点
掷出四个整数各多少次可以到达终点呢?如果解不唯一,输出任意一组即可。如果无解 输出impossible!

可将此题转化成ax+by=1的形式

我们使用和辗转相除法相似的思路,将extgcd(a,b,x,y)不断递归为extgcd(b,a%b,x,y),但同时我们要响应得更改x和y,即将x转化为上一次地规避的y,y转化为上一次递归的x-(a/b)*y。

具体证明请自行百度

代码

#include<iostream>

#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
int gcd(int a,int b)
{     if(a<b)swap(a,b);
      if(a%b==0)return b;
      return gcd(b,a%b);
}
void exgcd(int a,int b,int& x,int& y)
{     if(b==0){
         x=1;
         y=0;
         return;
      }
      exgcd(b,a%b,x,y);
      int z=x;
      x=y;
      y=z-(a/b)*y;
}
int main()
{     int a,b,x,y,i,j,k;
      cin>>a>>b;
      if(gcd(a,b)!=1)puts("impossible!");
      exgcd(a,b,x,y);
      cout<<x<<' '<<y<<endl;
      return 0;
}

转载于:https://www.cnblogs.com/yzxverygood/p/8325499.html

你可能感兴趣的文章
C#对各种文件的操作-ini(2)
查看>>
JavaScript入门学习笔记(二)
查看>>
Project Euler 13 Large sum
查看>>
自动工作量资料档案库(AWR)报告的获得
查看>>
virtualBox中的centOS虚拟机硬盘扩容
查看>>
Android应用目录结构分析
查看>>
动画总结(UIView的动画)
查看>>
顶点着色器和片断着色器
查看>>
vc++实现禁用按钮
查看>>
flask with gae开发小结
查看>>
以打字形式展示placeholder的插件
查看>>
http文件导出写文件
查看>>
Globus的简单介绍
查看>>
[LeetCode] Search Insert Position 解题报告
查看>>
c# 的传递参数值传递与传递引用的区别,ref与out区别
查看>>
win7+vs2008+cuda5.x 环境配置二
查看>>
PHP5.5安装PHPRedis扩展
查看>>
c#Socket Tcp服务端编程
查看>>
java构造函数注意点
查看>>
Asp.net 中配置 CKEditor和CKFinder
查看>>