#扩欧#poj 2142 The Balance

题目

有两种砝码,重量分别为 A m g , B m g ,然后要称量出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;
}

猜你喜欢

转载自blog.csdn.net/sugar_free_mint/article/details/80755188