Exgcd学习笔记
Exgcd 学习笔记
引理
Bézout's theorem
对于
Exgcd 推导
我们知道如何通过辗转相除法求出
代码如下:(顺带求了个
inline int exgcd(int a,int b,int &x,int &y) { if(b==0) { x=1,y=0; return a; } int tmpx,tmpy; int d=exgcd(b,a-(a/b)*b,tmpx,tmpy); x=tmpy,y=tmpx-(a/b)*tmpy; return d; }
如何获得一般解?
我们得到的不过是一组可行解,那么如何由这组可行解推知一般解呢?
考虑如下构造:
同时我们也有刚刚得到的 :
整理就可以得到
如何获得有限制的解
即一组正整数解,以及此时
通过令
同理令
我们只需要去验证当
代码如下 :
inline void solve(int a,int b,int c) { if(c%gcd(a,b)!=0) { puts("-1"); return ; } int f=c/gcd(a,b),x,y; int d=exgcd(a,b,x,y); x*=f,y*=f; int t,tmpt; t=(int)floor(-1.0*d*x/b)+1; tmpt=(int)ceil(1.0*d*y/a)-1; if(y-t*a/d<=0) wr(x+t*b/d),putchar(' '),wr(y-tmpt*a/d),putchar('\n'); else printf("%lld %lld %lld %lld %lld\n",abs(t-tmpt)+1,x+t*b/d,y-tmpt*a/d,x+tmpt*b/d,y-t*a/d); }
本文来自博客园,作者:Hanggoash,转载请注明原文链接:https://www.cnblogs.com/Hanggoash/p/18430082
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库