#扩欧#poj 2142 The Balance

题目

有两种砝码,重量分别为 A m g , B m g Amg,Bmg Amg,Bmg,然后要称量出Cmg的药品,两种砝码可以放无限个,但是不能放在天平的同一边,求两种砝码最少能放多少个(1.A+B最小,2.Ax+By最小)


分析

按照题目,可以得到
ax+c=by或by+c=ax
只要知道一种砝码的数量,那么另一种的砝码的数量迎刃而解。
所以想到了扩欧,然后最后两种方案要比较。


代码

#include <cstdio>
#include <algorithm>
using namespace std;
int a,b,n,nx,ny,mx,my,x,y;
void exgcd(int a,int b,int &x,int &y){
	if (!b) x=1,y=0;
	else exgcd(b,a%b,y,x),y-=a/b*x;
}
int main(){
	while (scanf("%d%d%d",&a,&b,&n)&&(a||b||n)){
		int gcd=__gcd(a,b);
		a/=gcd; b/=gcd; n/=gcd;
		exgcd(a,b,x,y);
		nx=x*n;
		nx=(nx%b+b)%b;
		ny=(n-nx*a)/b;
		if (ny<0) ny=-ny;
		my=y*n;
		my=(my%a+a)%a;
		mx=(n-my*b)/a;
		if (mx<0) mx=-mx;
		if (nx+ny>mx+my) nx=mx,ny=my;
		printf("%d %d\n",nx,ny);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值