题目看着挺唬人,其实就是输入a,b,c用扩欧先求出一组特解x,y。
然后利用x,求出x的所有通解中的最小正整数tx(利用通解的周期性),接着根据关系ax+by=c,求出对应的ty(ty=(c-ax)/b).
然后利用y,求出y的所有通解中的最小正整数vy(利用通解的周期性),接着根据关系ax+by=c,求出对应的vx(tx=(c-bx)/b).
首先比较tx+ty与vx+vy的大小,取两者之间较小者。若两者相等,比较a*tx+b*ty与a*vx+b*vy的大小,取两者之间的较小者。
#include <iostream>
#include <stdio.h>
using namespace std;
int ex_gcd(int a,int b,int &x,int &y)
{
if(!b)
{
x=1;
y=0;
return a;
}
int d=ex_gcd(b,a%b,x,y);
int t=x;
x=y;
y=t-(a/b)*y;
return d;
}
int main()
{
int a,b,c;
while(cin >> a >> b >> c && (a+b+c)!=0)
{
int x,y;
int d=ex_gcd(a,b,x,y);
int t=b/d,v=a/d;
x *= c/d;
y *= c/d;
int tx=(x%t+t)%t;
int ty=(c-a*tx)/b;
if(ty<0)
{
ty=-ty;
}
int vy=(y%v+v)%v;
int vx=(c-b*vy)/a;
if(vx<0)
{
vx=-vx;
}
if(tx+ty>vx+vy)
{
x=vx;
y=vy;
}
else if(tx+ty==vx+vy)
{
if(tx*a+ty*b>vx*a+vy*b)
{
x=vx;
y=vy;
}
else
{
x=tx;
y=ty;
}
}
else
{
x=tx;
y=ty;
}
cout << x << " " << y << endl;
}
}