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 }   
 
原文地址:https://www.cnblogs.com/zyx-crying/p/9319502.html