欧几里得算法参考https://www.cnblogs.com/hadilo/p/5914302.html
扩展欧几里得就是 求方程ax+by=c的最小整数解
1. c%gcd(a,b)!=0 则方程无解
2. c%gcd(a,b)==0
则有a*x+b*y==gcd(a,b)成立
因为gcd(a,b)==gcd(b,a%b) 所以b*x+(a%b)*y==gcd(b,a%b)
因为a%b==a-(a/b)*b 所以a*y+b[x-(a/b)*y]=gcd(a,b)
得到递推关系 xn-1=yn yn-1=xn-(a/b)*yn
而边界就是在求gcd过程中当b==0时 有a'*x'+0*y'==gcd(a',0) 可以看出x'==1,y'==0
再将求得的x与y同除 c/gcd(a,b) 即可
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
void exgcd(ll a,ll b,ll& x,ll& y)
{
ll tx,ty;
if(b==0){
x=1,y=0;
return;
}
exgcd(b,a%b,tx,ty);
x=ty,y=tx-(a/b)*ty;
}
int main()
{
ll a,b,c,gcd,x,y;
scanf("%lld%lld%lld",&a,&b,&c);
exgcd(a,b,x,y);
gcd=a*x+b*y;
if(c%gcd!=0) printf("-1\n");
else printf("%lld %lld\n",-x*(c/gcd),-y*(c/gcd));
return 0;
}
本文详细介绍了扩展欧几里得算法,该算法用于求解线性方程ax + by = c的最小整数解。文章首先给出了算法的基本原理,并通过递归的方式实现了扩展欧几里得算法。此外,还提供了具体的代码实现,帮助读者更好地理解和应用该算法。
661

被折叠的 条评论
为什么被折叠?



