题目地址:http://poj.org/problem?id=2142
有两种可能的情况:
a与d放在一起,即 ax+d=by
b与d放在一起,即 ax=by+d
因为x,y是任取的 ,所以解下面一个方程
ax+by=d
利用扩展欧几里得定理,可得两组解,
1. x的最小非负解,及其对应的y
2. y的最小非负解,及其对应的x
因为求的是|x|+|y|的最小值,比较一下就好了
#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
int gcdEx(int a,int b,int& x,int& y)
{ //求ax+by=gcd(a,b) 的整数解 返回gcd(a,b);
if(b==0) {
x=1; y=0; return a;
}
int x1,y1;
int gcd=gcdEx(b,a%b,x1,y1);
x=y1;
y=x1-a/b*y1;
return gcd;
}
int main()
{
int a,b,d; int x,y;
while(cin>>a>>b>>d)
{
if(a==0&&b==0&&d==0) break;
int gd=gcdEx(a,b,x,y);
int k=d/gd,s1=b/gd,s2=a/gd;
int x1=(k*x%s1+s1)%s1,y1=fabs(d-a*x1)/b;
int y2=(k*y%s2+s2)%s2,x2=fabs(d-b*y2)/a;
if(x1+y1<x2+y2) cout<<x1<<' '<<y1<<endl;
else cout<<x2<<' '<<y2<<endl;
}
return 0;
}