扩展欧几里德的收获,和遗憾

  1. 扩展欧几里德问题的研究花了 近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");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值