扩展欧几里得算法应用
#include<iostream>
using namespace std;
int x,y,d;
int exgcd(int a,int b,int &x,int &y)
{
if(b == 0)
{
x = 1;
y = 0;
return a;
}
int d = exgcd(b,a%b,y,x);
y = y-a/b*x;
return d;
}
int main()
{
int a,b,d;
while(cin>>a>>b>>d)
{
if(a+b+d==0)
break;
int gcd;
gcd = exgcd(a,b,x,y);
a=a/gcd;
b=b/gcd;
int ans1,ans2,ans3,ans4;
int sum1,sum2;
x = x*(d/gcd);
y = y*(d/gcd);
ans1 = ((x+b)%b+b)%b;
int k = (ans1-x)/b;
ans2 = y-k*a;
if(ans2<0)
ans2 = -ans2;
sum1 = ans1*a+ans2*b;
ans4 = ((y+a)%a+a)%a;
k = (ans4-y)/a;
ans3 = x - k*b;
if(ans3<0)
ans3 = -ans3;
sum2 = ans3*a+ans4*b;
if(sum1>sum2)
{
cout<<ans3<<' '<<ans4<<endl;
}
else if(sum1<sum1)
cout<<ans1<<' '<<ans2<<endl;
else
{
if(ans1+ans2<ans3+ans4)
{
cout<<ans1<<' '<<ans2<<endl;
}
else
cout<<ans3<<' '<<ans4<<endl;
}
}
return 0;
}