- 扩展欧几里德问题的研究花了 近10个小时,大致上是懂了,总之存在ax+by=gcd(a,b) ,且只要c/gcd(a,b)能除尽,就一定存在ax+by = c ,
如果想要有限制,请查询裸扩展欧几里得算法 其有一部就是神器了:
x = (x%b+b)%b y = (y%a -a)%a
然后,在求出的x0,y0。 X = x0 + (b/gcd)*t. Y = y0- (a/gcd)*t;
两者互相变换,有来有回,就成了所有的解
但是还不够,对于其正负性,我还没进行完整的实验。
详情更多的 扩展欧几里德 百度
http://www.cnblogs.com/frog112111/archive/2012/08/20/2648326.html
经典例题:青蛙的约会http://blog.csdn.net/qq_33199236/article/details/51469138
http://blog.csdn.net/zhjchengfeng5/article/details/7786595
https://www.zhihu.com/question/23792292
大神:
点击打开链接
模板
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <iostream>
#include <vector>
#define ll long long
using namespace std;
ll exgcd(ll a, ll b, ll &x, ll &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
ll g=exgcd(b,a%b,x,y),t;
t=x;
x=y;
y=t-(a/b)*y;
return g;//g是全程不变的,就是a,b的最小公约数。<span style="font-family: Arial; line-height: 26px;"> </span>
}
int main()
{
ll a,b,c,x,y;
cin>>a>>b>>c;
ll t=exgcd(a,b,x,y);
if(c%t==0)
printf("%lld %lld\n",-x*c/t,-y*c/t);
else puts("-1");
}