码迷,mamicode.com
首页 > 编程语言 > 详细

扩展欧几里得算法

时间:2015-09-03 19:09:28      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:

1 欧几里得算法标准代码

这个代码算的是符合a * x + b * y = gcd(a, b)的一组x, y, 同时返回了gcd(a, b)

因为a * x1 + b * y1 = gcd(a, b)

  gcd(a, b) = gcd(b, a % b)

那么a * x1 + b * y1 = gcd(b, a % b) = b * x2 + (a - a/b*b) * y2;   // a % b = a - a/b*b;

__int64 exGcd(__int64 a,__int64 b,__int64 &x,__int64 &y)
{
    if(b==0){
        x=1;
        y=0;
        return a;
    }
    __int64 g=exGcd(b,a%b,x,y);
    __int64 temp=x;
    x=y;
    y=temp-(a/b)*y;
    return g;
}

2求 a * x + b * y = c的解

就是根据上面模板算出gcd(a, b)的同时算出a * x + b * y = gcd(a, b)的解,

然后x = x * c / gcd(a, b);   y = y * c / gcd(a, b);

#include <cstdio>
__int64 exGcd(__int64 a,__int64 b,__int64 &x,__int64 &y)
{
    if(b==0){
        x=1;
        y=0;
        return a;
    }
    __int64 g=exGcd(b,a%b,x,y);
    __int64 temp=x;
    x=y;
    y=temp-(a/b)*y;
    return g;
}
int main()
{
    __int64 a, b, c, x, y, gc;
    while(scanf("%I64d%I64d%I64d", &a, &b, &c) == 3)
    {
        gc = exGcd(a, b, x, y);
        if(c % gc)
        {
            printf("无解\n");
            continue;
        }
        else
        printf("%I64d %I64d\n", x*c/gc, y*c/gc);
    }
}

 

扩展欧几里得算法

标签:

原文地址:http://www.cnblogs.com/rain-1/p/4780486.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!