HDU 2669Romantic(扩展欧几里德裸题)

来源:互联网 发布:linux有什么认证 编辑:程序博客网 时间:2024/05/18 00:18
裸的扩展欧几里德解不定方程,话不多说,看代码中间
#include<iostream>#include<cstdio>using namespace std;int x, y, c, r;int exgcd(int a, int b, int &x, int &y)//知道扩展欧几里德此处不难写,裸模版;{    if(b == 0)    {        x = 1;        y = 0;        return a;    }    int r = exgcd(b, a%b, x, y);    int t = x;    x = y;    y = t - a/b*y;    return r;}bool judge_exgcd(int a, int b, int c, int &x, int &y){    int r = exgcd(a, b, x, y);    if(c % r != 0)//即 ax + by = c; C mod GCD(a ,b)方程才有整数解,否则没有整数解,返回false表示无解,输出sorry;    {        return false;    }    int k = c / r; //用来求ax + by = c; 的特解,只不过c = 1; 进行到此处a,b一定互质,也就是r = 1; 即此及一下两行均可省略。     x *= k;    y *= k;    return true;}int main(){    int a, b;    while(scanf("%d%d",&a, &b) != EOF)    {        c = 1;        bool flag = judge_exgcd(a, b, c, x, y);        if(!flag)        {            printf("sorry\n");            continue;        }        while(x < 0)//x有小于零的情况, 别问我为什么,就像妈妈一定有孩子一样,一定有,非要找原因的话,到16, 17行找原因去,把过程中的数字给打印出来看看就知道了        {            x += b*10;            y -= a*10;        }        int k = x/b;        x = x%b;        y += a*k;        printf("%d %d\n",x, y);    }    return 0;}

的注释即可: