poj_2142_The Balance

这里写图片描述

题意:给你两个砝码的质量A,B。称量一个鬼东东的质量为K,问最少要多少砝码。

题解:易得出
Ax-By=K,用扩展欧几里德算法去元,求出x,y。
求出x,y然后分成两组,求出x可以根据方程推出y,求出y可以根据方程推出x.然后取两组相加的最小值即可.

代码:

 1 #include <stdio.h>      
 2 #include <iostream>      
 3 #include <algorithm>      
 4 #include <sstream>      
 5 #include <stdlib.h>      
 6 #include <string.h>      
 7 #include <limits.h>      
 8 #include <string>      
 9 #include <time.h>      
10 #include <math.h>      
11 #include <queue>      
12 #include <stack>      
13 #include <map>   
14 using namespace std;
15 typedef long long ll;
16 
17 ll gcd(ll a,ll b){  
18     if(b==0) return a;  
19     return gcd(b,a % b);  
20 }  
21 
22 void ggcd(ll a,ll b,ll &x,ll &y){
23     if (b==1){  
24         x=1; y=1-a;  
25     } else{  
26         ll x1,y1;  
27         ggcd(b,a%b,x1,y1);  
28         x=y1; y=x1-x*(a/b);  
29     }  
30 }  
31 
32 int main(){  
33     ll n,m,k;  
34     cin>>n>>m>>k;
35     while (n||m||k)  
36     {  
37         ll g=gcd(n,m);  
38         ll x,y,y1,x1;  
39         n/=g; m/=g;  
40         ggcd(n,m,x,y);
41         x1=x*k/g;    
42         x1=(x1%m+m)%m;  
43         y1=(k/g-n*x1)/m;  
44         if (y1<0) y1=-y1;  
45 
46         y=y*k/g;  
47         y=(y%n+n)%n;
48         x=(k/g-m*y)/n;
49         if (x<0) x=-x;
50         if (x+y>x1+y1) {
51             x=x1; y=y1;  
52         }
53         cout<<x<<" "<<y<<endl;
54         cin>>n>>m>>k;
55     }
56     return 0;
57 }   

 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值