扩展欧几里得算法

来源:互联网 发布:我的恐怖妻子 知乎 编辑:程序博客网 时间:2024/06/03 18:43

紫书:

求直线ax+by+c=0上的整数点(x,y);

先求ax+by+c=gcd(a,b)的解

void gcd(int a,int b,int &d,int &x,int &y)//d为a,b的最大公因数{    if(!b)    {        d=a;        x=1;        y=0;    }    else    {        gcd(b,a%b,d,y,x);        y-=x*(a/b);    }}

若方程的一组解为(x0,y0),则通解为(x0+kb',y0+ka')(a'=a/gcd(a,b),b'=b/gcd(a,b));k为任意整数

例题:

Now tell you two nonnegative integer a and b. Find the nonnegative integer X and integer Y to satisfy X*a + Y*b = 1. If no such answer print "sorry" instead.

 

Input

The input contains multiple test cases.
Each case two nonnegative integer a,b (0<a, b<=2^31)

 

Output

output nonnegative integer X and integer Y, if there are more answers than the X smaller one will be choosed. If no answer put "sorry" instead.
 

Sample Input

77 5110 4434 79

#include<cstdio>#include<iostream>using namespace std;void gcd(int a,int b,int &d,int &x,int &y){    if(!b)    {        d=a;        x=1;        y=0;    }    else    {        gcd(b,a%b,d,y,x);        y-=x*(a/b);    }}int main(){    int x,y,a,b,d;    while(~scanf("%d%d",&a,&b))    {        gcd(a,b,d,x,y);        if(d!=1)        {            printf("sorry\n");            continue;        }        else        {            while(x<=0)            {                x=x+b;                y=y-a;            }            printf("%d %d\n",x,y);        }    }    return 0;}


原创粉丝点击