#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long LL;
const int INF = 100000000;
LL fabs(LL a)
{
if( a < 0 )
return (-a);
else
return a;
}
void Ex_Gcd(LL a, LL b, LL &d, LL &x, LL &y)
{
if(b == 0)
{
x = 1;
y = 0;
d = a;
return ;//递归一定要有出口!
}
Ex_Gcd(b, a%b, d, x, y);
LL temp = x;
x = y;
y = temp - (a/b)*y;
}
int main()
{
LL a, b, c;
while(scanf("%I64d %I64d %I64d", &a, &b, &c) != EOF)
{
if(a + b + c == 0)
break;
bool flag = false;
if(a < b)
{
LL temp = a;
a = b;
b = temp;
flag = true;
}
LL d, x0, y0;
Ex_Gcd(a, b, d, x0, y0);
x0 = x0 * (c/d);
y0 = y0 * (c/d);
LL t = y0 * d / a;
LL MinSum1 = INF, MinSum2, t0;
for(LL i = t-10; i <= t+10; ++i)
{
if(fabs(x0 + (b / d) * i) + fabs(y0 - (a / d) * i) < MinSum1)
{
t0 = i;
MinSum2 = a * fabs(x0 + (b / d) * i) + b * fabs(y0 - (a / d) * i);
MinSum1 = fabs(x0 + (b/d) * i) + fabs(y0 - (a/d) * i);
}
else if(fabs(x0 + (b / d) * i) + fabs(y0 - (a / d) * i) == MinSum1)
{
if(a * fabs(x0 + (b / d) * i) + b * fabs(y0 - (a / d) * i) < MinSum2)
{
t0 = i;
MinSum2 = a * fabs(x0 + b/d * i) + b * fabs(y0 - (a/d) * i);
}
}
}
if( !flag )
printf("%I64d %I64d\n", fabs(x0 + (b/d) * t0), fabs(y0 - (a/d) * t0));
else
printf("%I64d %I64d\n", fabs(y0 - (a/d) * t0), fabs(x0 + (b/d) * t0));
}
return 0;
}
/**
输入样例:
700 300 200
500 200 300
500 200 500
275 110 330
275 110 385
648 375 4002
3 1 10000
0 0 0
输出样例:
1 3
1 1
1 0
0 3
1 1
49 74
3333 1
*/
The Balance POJ 2142
最新推荐文章于 2019-04-05 17:50:05 发布