题目地址:http://poj.org/problem?id=2142
#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <cstdio>
using namespace std;
typedef long long ll;
#define INF 0x3ffffffffLL
#define MAX(a,b) a>b?a:b
#define MIN(a,b) a>b?b:a
#define N 101
ll Abs(ll a)
{
if(a<0) a=-a;
return a;
}
void swap(ll &a,ll &b) { //交换
ll t=a;
a=b;
b=t;
}
void extend_gcd(ll a,ll b,ll &d,ll &x,ll &y){ //扩展欧几里得
if(!b){
d=a;x=1;y=0;
}
else {
extend_gcd(b,a%b,d,y,x);
y-=x*(a/b);
}
}
int main()
{
ll a,b,c,d,x,y,x0,y0,a0,b0,ans0,ans1,flag;
while(cin>>a>>b>>c&&a+b+c)
{
flag=0;
if(a<b) {swap(a,b);flag=1;}
extend_gcd(a,b,d,x,y);
x0=x*(c/d);
y0=y*(c/d);
ll temp=(y0*d)/a;
ll minn=INF;
ll sum_weight=INF;
ll anst;
for(ll i=temp-1;i<=temp+1;i++) //在左右+-1便可得到解。
{
if(Abs(x0+b/d*i)+Abs(y0-a/d*i)<minn)
{
ans0=Abs(x0+b/d*i);
ans1=Abs(y0-a/d*i);
sum_weight=a*ans0+b*ans1;
minn=ans0+ans1;
}
else if(Abs(x0+b/d*i)+Abs(y0-a/d*i)==minn&&sum_weight>(a*Abs(x0+b/d*i)+b*Abs(y0-a/d*i)))
{
ans0=Abs(x0+b/d*i);
ans1=Abs(y0-a/d*i);
sum_weight=a*ans0+b*ans1;
minn=ans0+ans1;
}
}
if(!flag) cout<<ans0<<" "<<ans1<<endl;
else cout<<ans1<<" "<<ans0<<endl;
}
return 0;
}