扩展欧几里德
例题 双六游戏
一个双六上面有向前 向后无限延续的格子, 每个格子都写有整数。其中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;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】博客园携手 AI 驱动开发工具商 Chat2DB 推出联合终身会员
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个超经典 WinForm,WPF 卡死问题的终极反思
· ASP.NET Core - 日志记录系统(二)
· .NET 依赖注入中的 Captive Dependency
· .NET Core 对象分配(Alloc)底层原理浅谈
· 聊一聊 C#异步 任务延续的三种底层玩法
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(一):从.NET IoT入
· .NET 开发的分流抢票软件,不做广告、不收集隐私
· 一个超经典 WinForm,WPF 卡死问题的终极反思
· ASP.NET Core - 日志记录系统(二)
· 实现windows下简单的自动化窗口管理