题目地址: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;
}