d.用2种砝码,质量分别为a和b,称出质量为d的物品。求所用的砝码总数量最小(x+y最小),并且总质量最小(ax+by最小)。
s.扩展欧几里得求解不定方程。
设ax+by=d.
题意说不定方程一定有解。对于不定整数方程pa+qb=c,若 c mod Gcd(p, q)=0,则该方程存在整数解,否则不存在整数解。
也就是说,d mod gcd(a,b)=0.
a,b,d同时除以gcd(a,b)得到a'x+b'y=d';
用扩展欧几里德求出 a'x+b'y=gcd(a',b')=1的解(x,y),
那么原来这个a'x+b'y=d'的解就是(x*d',y*d')。
然后分两种情况来求就行了(假设物品放右边):
(1)令x是最小正整数,a放左边的最优解;(y<0代表b放右边)
(2)令y是最小正整数,b放左边的最优解;
两者中x+y小的就是结果。
c.
#include<iostream>
#include<stdio.h>
using namespace std; int gcd(int a,int b){
return b?gcd(b,a%b):a;
} int ex_gcd(int a,int b,int &x,int &y){
if(b==){
x=;
y=;
return a;
}
int d=ex_gcd(b,a%b,x,y);
int t=x;
x=y;
y=t-a/b*y;
return d;
} int main(){ int a,b,d; int q;//a,b的最大公约数
int x,y;
int x1,y1;
int x2,y2; while(~scanf("%d%d%d",&a,&b,&d)){
if(a==&&b==&&d==)break; q=gcd(a,b);
//这里 对于不定整数方程pa+qb=c,若 c mod Gcd(p, q)=0,则该方程存在整数解,否则不存在整数解。
//不定方程:ax+by=d
a=a/q;
b=b/q;
d=d/q;//题目一定有解,可以整除 //不定方程:ax+by=d q=ex_gcd(a,b,x,y);//求的是ax+by=gcd(a,b)=1 //令x是最小正整数,a放左边的最优解
x1=x*d;
x1=(x1%b+b)%b;//x变为最小正整数
y1=(d-a*x1)/b;
if(y1<){
y1=-y1;
} //令y是最小正整数,b放左边的最优解
y2=y*d;
y2=(y2%a+a)%a;//y变为最小正整数
x2=(d-b*y2)/a;
if(x2<){
x2=-x2;
} //x+y和最小
if(x1+y1<x2+y2){
printf("%d %d\n",x1,y1);
}
else{
printf("%d %d\n",x2,y2);
} } return ;
}
POJ - 2142 The Balance(扩展欧几里得求解不定方程)的更多相关文章
-
POJ 2142 - The Balance [ 扩展欧几里得 ]
题意: 给定 a b n找到满足ax+by=n 的x,y 令|x|+|y|最小(等时令a|x|+b|y|最小) 分析: 算法一定是扩展欧几里得. 最小的时候一定是 x 是最小正值 或者 y 是最小正值 ...
-
POJ.2142 The Balance (拓展欧几里得)
POJ.2142 The Balance (拓展欧几里得) 题意分析 现有2种质量为a克与b克的砝码,求最少 分别用多少个(同时总质量也最小)砝码,使得能称出c克的物品. 设两种砝码分别有x个与y个, ...
-
POJ 2142:The Balance_扩展欧几里得(多组解)
先做出两个函数的图像,然后求|x|+|y|的最小值.|x|+|y|=|x0+b/d *t |+|y0-a/d *t| 这个关于t的函数的最小值应该在t零点附近(在斜率大的那条折线的零点附近,可以观察出 ...
-
exgcd扩展欧几里得求解的个数
知识储备 扩展欧几里得定理 欧几里得定理 (未掌握的话请移步[扩展欧几里得]) 正题 设存在ax+by=gcd(a,b),求x,y.我们已经知道了用扩欧求解的方法是递归,终止条件是x==1,y==0: ...
-
【lydsy1407】拓展欧几里得求解不定方程+同余方程
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1407 题意: 有n个野人,野人各自住在第c[i]个山洞中(山洞成环状),每年向前走p[i] ...
-
POJ 2115 C Looooops(扩展欧几里得)
辗转相除法(欧几里得算法) 时间复杂度:在O(logmax(a, b))以内 int gcd(int a, int b) { if (b == 0) return a; return gcd(b, a ...
-
POJ 2115 C Looooops(扩展欧几里得应用)
题目地址:POJ 2115 水题. . 公式非常好推.最直接的公式就是a+n*c==b+m*2^k.然后能够变形为模线性方程的样子,就是 n*c+m*2^k==b-a.即求n*c==(b-a)mod( ...
-
POJ 2115 C Looooops扩展欧几里得
题意不难理解,看了后就能得出下列式子: (A+C*x-B)mod(2^k)=0 即(C*x)mod(2^k)=(B-A)mod(2^k) 利用模线性方程(线性同余方程)即可求解 模板直达车 #incl ...
-
扩展欧几里得求解同余方程(poj 1061)
设方程 ax + by = c , 若 gcd(a,b) 是 c的因子(记作gcd(a,b)|c)则方程有解,反之无解. 其中x0,y0是方程的一组特解 , d = gcd(a,b), poj1061 ...
随机推荐
-
Github .gitignore详解
在使用git作版本控制时,git会默认把git控制的文件夹里面的所有文件都加入到版本控制.但是在实践中,我们经常会遇到不想某些文件或文件夹被git追踪的情况.比如logs文件.代码构建过程中产生的一些 ...
-
1.Windows安装PostgreSQL
按照下面的步骤,Windows机器上安装PostgreSQL.请确保已开启第三方防病毒,同时安装. 挑选你想要的PostgreSQL的版本号,可以点击以下链接下载 EnterpriseDB Windo ...
-
JS学习第四课
当我们删除某列表格,再添加新的一列时,它的序号该如何控制呢.这里id=oTab.tBodies[0].rows.length+1 otd.innerHTML=id++; 很关键哦. ...
-
Android带头像的用户注册页面
详细的图文可以到我的百度经验去查看:http://jingyan.baidu.com/article/cd4c2979eda109756e6e60de.html 首先是注册页面的布局: <?xm ...
-
JAVA与C++的区别和联系
这篇总结的貌似不错: http://wenku.baidu.com/link?url=VixkWGl0BzUkmceaDJnQeUhzKEIex6poGaKKvMTP87P8a7HTmS5uIi87I ...
-
TCP_NODELAY详解
在网络拥塞控制领域,我们知道有一个非常有名的算法叫做Nagle算法(Nagle algorithm),这是使用它的发明人John Nagle的名字来命名的,John Nagle在1984年首次用这个算 ...
-
Struts2(三)配置详解
一.概述 Struts2提供了多种可选的配置文件形式. 其中,struts-default.xml和default.properties是框架级别的配置文件,这两个文件在Struts的核心JAR包中, ...
-
2018.09.23 关键网线(tarjan)
描述 给出一个无向连通图,即在任一个点对间存在路径.有的点提供服务a, 有的点提供服务b .同一个点可能有两种服务类型.每个点必须与提供2种服务的点连通.如果一个边断掉,就可能出现有些点不能被服务到, ...
-
XAMPP安装PHP_GMP
CentOS 6.4 Xampp 7.1.12 下载PHP7.1.12的源码包 yum install gmp-devel yum install m4 .tar.xz cd /root/php-/e ...
-
《转》python学习--基础下
转自http://www.cnblogs.com/BeginMan/archive/2013/04/12/3016323.html 一.数字 在看<Python 核心编程>的时候,我就有点 ...