题意:
给你两种不同重量的砝码a,b问如何用最少的a,b使得加上重量为c的物品能放在天平上并保持平衡
令a使用x个b使用y个 那么 ax-by=c 或者 -ax+by=c
我们可以转化求ax+by=c 然后使得abs(x)+abs(y)的值最小
对于ax+by=c我们可以求ax/d+bx/d=1 其中d=gcd(a,b) 利用扩展gcd
分别求出x和y最小正整数然后比较那种情况下的abs(x)+abs(y)最小即可
ACcode:
#include <iostream>
#include <cstdio>
using namespace std;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int ex_gcd(int a,int b,int &x,int &y){
if(a==0&&b==0)return -1;
if(b==0){x=1,y=0;return a;}
int d=ex_gcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
int main(){
int a,b,c,x,y,vx,vy;
while(scanf("%d%d%d",&a,&b,&c)&&(a+b+c)){
int d=gcd(a,b);
a/=d;
b/=d;
c/=d;
ex_gcd(a,b,x,y);
vy=y*c;
vy=(vy%a+a)%a;
vx=(c-b*vy)/a;
if(vx<0)vx=-vx;
x*=c;
x=(x%b+b)%b;
y=(c-a*x)/b;
if(y<0)y=-y;
if(x+y<vx+vy){
vx=x;vy=y;
}
cout<<vx<<" "<<vy<<'\12';
}
return 0;
}