要求求出的解满足|x|+|y|最小,第二条件是x<=y。
直接求解即可,无需加特判。
有点疑问?
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int _gcd(int x,int y)
{
return y?_gcd(y,x%y):x;
}
int extend_gcd(int a,int b,int &x,int &y)
{
if(!b)
{
x=1;
y=0;
return a;
}
int ans=extend_gcd(b,a%b,x,y);
int tmp=x;
x=y;
y=tmp-(a/b)*y;
return ans;
}
void cal(int a,int b,int c)
{
int x,y;
int g=extend_gcd(a,b,x,y);
b/=g;
a/=g;
/*int xx=x; int yy=y; for(int k=-max(abs(xx),abs(yy));k<=max(abs(xx),abs(yy));k++) { int tx=xx+k*b; int ty=yy-k*a; if(abs(tx)+abs(ty)<abs(x)+abs(y)) { x=tx; y=ty; } else if(abs(tx)+abs(ty)==abs(x)+abs(y)) { if(tx<=ty&&x>y) { x=tx; y=ty; } } }*/
printf("%d %d\n",x,y);
}
int main()
{
int a,b;
while(scanf("%d%d",&a,&b)!=EOF)
{
int c=_gcd(a,b);
cal(a,b,c);
}
return 0;
}