集训笔记---扩展欧几里德算法(HDUOJ NO.2669 Romantic 有点简单gcd)

题目大意是要我们去寻找二元一次方程的一组正解而且这个方程其实比较简单,但我在做的时候犯了一个错误,那就是ax+by=c的解确实和ax+by=gcd(a, b)的解一样,但是递归算法做出来的解可并不能保证一定是正解呦,所以利用欧几里德算法递归求出第二个方程的解以后,我们要做的是把我们的解(其实是把x,y可以是负数)变成正的,而且根据题意这样的解也是一定存在的

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2669

下面是AC代码

#include<cstdio>
#include<algorithm>
using namespace std;
int gcd(int n, int m, int &x, int &y);
int main(void)
{
    int n, m, x, y;
    while(scanf("%d %d", &n, &m) != EOF)
    {
        int b = gcd(n, m, x, y);//函数的作用是找到最大公约数 
        if(b != 1)
        {
            printf("sorry\n");
        }
        else
        {
            while(x < 0)//确实这是一组解但并不一定是正解,所以,我们要干点什么 
            //理一下方程发现下面的x, y也是一组解,我们要找到最小那一组正解 
            { 
                x = x + m;
                y = y - n;
            }
            printf("%d %d\n", x, y);
        }
    }
}
int gcd(int n, int m, int &x, int &y)
{
    int d = n;
    if(m == 0)// 递归终止条件,即最后一次递归发生的情况 
    {
        x = 1;
        y = 0;
    }
    else
    {
        d = gcd(m, n%m, y, x);
        y = y - (n/m)*x;
    }
    return d;
}

猜你喜欢

转载自blog.csdn.net/zzuli_xiaomingke/article/details/81773907