扩展欧几里得求方程的解
#include <stdio.h>
#include <stdlib.h>
typedef long long ll;
ll ext_gcd(ll a,ll b,ll *x,ll *y)
{
if(b==0)
{
*x=1;
*y=0;
return a;
}
ll g=ext_gcd(b,a%b,x,y);
ll t=*x;
*x=*y;
*y=t-(a/b)*(*y);
return g;
}
int main()
{
ll a,b,g,x,y;
while(scanf("%lld%lld",&a,&b)!=EOF)
{
g=ext_gcd(a,b,&x,&y);
if(g!=1)
printf("sorry\n");
else
{
if(x<0)
{x=x+(b/g);
y=y-(a/g);
}
/*利用欧几里得求出x和y,但x可能是正数也可能是负数
怎么得到最小的正整数x?使其满足方程
若ax+by=c,若此处c为gcd(a,b)则只要让x加上一次k
就可以成为正整数k=b/g(a,b)
当c为gcd(a,b)的倍数时则加一次可能不行。
例如3x+10y=1,利用欧几里得求出x=-3,y=1
要使x变成最小正整数因为1=gcd(3,10)
所以x=x+b/gcd(a,b)=x+10/1=7,当然根据通解
y=y-a/gcd(a,b)=y-3/1=-2
例如math文件的例子3x+10y=9显然加一次不可以
利用文件上的方法*/
printf("%lld %lld\n",x,y);
}
}
return 0;
}