解题思路大致就是解一个同余式,ax=c(mod b),解出来是x0,y0
要找到题目所谓的最小解,即x0=x0+(b/d)*n;y0=y0-(a/d)*n使|x0|+|y0|最小,如果让a>b这样的话,|x0|+|y0|就是先减后增的y0-(a/d)*n=0解出来n附近的n值可得到要求的值 。
#include<stdio.h>
#include<cstdlib>
#include<iostream>
#include<math.h>
using namespace std;
#define ll long long
ll abss(ll a)
{
if(a<0)
return -a;
return a;
}
ll exgcd(ll m,ll& x,ll n,ll& y)
{
ll x1,y1,x0,y0;
x0=1;y0=0;
x1=0;y1=1;
ll r=(m%n+n)%n;
ll q=(m-r)/n;
x=0;y=1;
while(r)
{
x=x0-q*x1;y=y0-q*y1;
x0=x1;y0=y1;
x1=x;y1=y;
m=n;n=r;r=m%n;
q=(m-r)/n;
}
return n;
}
int main()
{
// freopen("data.txt","r",stdin);
ll a,b,c,d,x0,y0;
while(cin>>a>>b>>c&&(a+b+c))
{
int tt=0;
if(a<b)
{
tt=1;
ll e;
e=a;
a=b;
b=e;
}
d=exgcd(a,x0,b,y0);
x0=x0*(c/d);
y0=y0*(c/d);
ll t=(y0)*d/a;
ll mini=9999999999,minm;
ll ax,by;
for(ll i=t-10;i<=t+10;i++)
{
if(abss(x0+b/d*i)+abss(y0-a/d*i)<mini)
{
ax=abss(x0+b/d*i);
by=abss(y0-a/d*i);
mini=ax+by;
minm=a*abss(x0+b/d*i)+b*abss(y0-a/d*i);
}
else if(abss(x0+b/d*i)+abss(y0-a/d*i)==mini)
{
if(a*abss(x0+b/d*i)+b*abss(y0-a/d*i)<minm)
{
ax=abss(x0+b/d*i);
by=abss(y0-a/d*i);
mini=ax+by;
minm=a*abss(x0+b/d*i)+b*abss(y0-a/d*i);
}
}
}
if(!tt)
cout<<ax<<' '<<by<<endl;
else cout<<by<<' '<<ax<<endl;
}
}