您的位置:首页 > 其它

POJ 2142 扩展欧几里得

2015-05-30 20:09 344 查看
题意:手中有一个天平 质量分别为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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: