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