题意:手中有一个天平 质量分别为a b的砝码和c的物品 砝码两边都可以摆放 求砝码的个数使得天平平衡 (要求使得砝码的数量最小 若有相等的则使总质量最小)
思路:分别求x的最小正整数解和对应的y的值 y的最小正整数解对应的x的值 两组进行比较
#include <iostream>
#include <cstdio>
#include <stdlib.h>
using namespace std;
typedef long long LL;
LL gcd(LL a,LL b)
{
return b?gcd(b,a%b):a;
}
void exgcd(LL a,LL b,LL &x,LL &y)
{
if(b==0)
{
x=1;
y=0;
return ;
}
exgcd(b,a%b,x,y);
LL tmp=x;
x=y;
y=tmp-(a/b)*y;
}
int main()
{
LL a,b,w;
while(cin>>a>>b>>w)
{
if(a==0&&b==0&&w==0)
break;
LL k=gcd(a,b);
a/=k;
b/=k;
w/=k;
LL x,y;
exgcd(a,b,x,y);
x*=w,y*=w;
LL x1=(x%b+b)%b,y1=(w-a*x1)/b;
LL y2=(y%a+a)%a,x2=(w-b*y2)/a;
int sum1=abs(x1)+abs(y1),sum2=abs(x2)+abs(y2);
if(sum1<sum2)
cout<<abs(x1)<<" "<<abs(y1)<<endl;
if(sum1>sum2)
cout<<abs(x2)<<" "<<abs(y2)<<endl;
if(sum1==sum2)
{
LL sum_weight1=x1*a+y1*b;
LL sum_weight2=x2*a+y2*b;
if(sum_weight1<sum_weight2)
cout<<abs(x1)<<" "<<abs(y1)<<endl;
else
cout<<abs(x2)<<" "<<abs(y2)<<endl;
}
}
return 0;
}