poj 2412 The Balance 【exgcd】By cellur925
一遇到数学就卡住,我这是怎么肥4...(或许到图论会愉悦吧,逃)
Description
* 给出两种重量为的 A, B 的砝码,给出一种使用最少的砝码的方
式,称出重量 C。
我们可以比较容易地列出方程$Ax+By=C$.之后来一发exgcd搞,求出方程的一组特解。平时我们求的往往是最小解,但这次它却要求两解之和最小。我们要做特殊的变形。
首先我们应该知道方程的通解:(约定:设x0,y0为一组特解,t为任意整数,设a>b(不行再交换))
那么有 $x=x0+b/gcd*t$
$y=y0-a/gcd*t$
而本题中,我们的答案就是|x|+|y|的最小值。
平时那种加模数再取膜的方法行不通了,我们从数学的角度分析这个函数,x是单调递增,而y是单调递减。因为a>b,所以减的更快。所以我们可以推出,当$y0-a/gcd*t=0$时函数有最小值(具体我也布吉岛啊qwq我好菜)
可得$t=y0*gcd/a$
所以我们把答案约束在了一个范围,即[t-1,t+1],枚举取最值即可。
不过要注意的是,我们开始约定了a>b,当a<b时我们进行了交换,但是输出的时候,我们需要换过来。(错了几次的原因)
Code
#include<algorithm>
#include<cstdio> using namespace std;
typedef long long ll; ll a,b,c,x,y; ll exgcd(ll aa,ll bb,ll &xx,ll &yy)
{
if(bb==)
{
xx=;yy=;
return aa;
}
ll d=exgcd(bb,aa%bb,xx,yy);
ll z=xx;xx=yy;yy=z-yy*(aa/bb);
return d;
} ll sabs(ll u)
{
if(u>) return u;
else return -u;
} int main()
{
while(scanf("%lld%lld%lld",&a,&b,&c)!=EOF&&a!=)
{
x=,y=;
bool flag=;
if(a<b) swap(a,b),flag=;
ll gong=exgcd(a,b,x,y);
x=x*(c/gong);y=y*(c/gong);
ll t=y*gong/a;
ll ans=,rx=,ry=;
for(int i=t-;i<=t+;i++)
{
ll tmp=sabs(x+b/gong*i)+sabs(y-a/gong*i);
if(tmp<ans) ans=tmp,rx=sabs(x+b/gong*i),ry=sabs(y-a/gong*i);
}
if(!flag)printf("%lld %lld\n",rx,ry);
else printf("%lld %lld\n",ry,rx);
}
return ;
}
poj 2412 The Balance 【exgcd】By cellur925的更多相关文章
- 图论常用算法之一 POJ图论题集【转载】
POJ图论分类[转] 一个很不错的图论分类,非常感谢原版的作者!!!在这里分享给大家,爱好图论的ACMer不寂寞了... (很抱歉没有找到此题集整理的原创作者,感谢知情的朋友给个原创链接) POJ:h ...
- POJ 3280 Cheapest Palindrome【DP】
题意:对一个字符串进行插入删除等操作使其变成一个回文串,但是对于每个字符的操作消耗是不同的.求最小消耗. 思路: 我们定义dp [ i ] [ j ] 为区间 i 到 j 变成回文的最小代价.那么对于 ...
- 【exgcd】卡片
卡片 题目描述 你有一叠标号为1到n的卡片.你有一种操作,可以重排列这些卡片,操作如下:1.将卡片分为前半部分和后半部分.2.依次从后半部分,前半部分中各取一张卡片,放到新的序列中.例如,对卡片序列( ...
- POJ 2142 The Balance【扩展欧几里德】
题意:有两种类型的砝码,每种的砝码质量a和b给你,现在要求称出质量为c的物品,要求a的数量x和b的数量y最小,以及x+y的值最小. 用扩展欧几里德求ax+by=c,求出ax+by=1的一组通解,求出当 ...
- POJ 1837 Balance 【DP】
题意:给出一个天平,给出c个钩子,及c个钩子的位置pos[i],给出g个砝码,g个砝码的质量w[i],问当挂上所有的砝码的时候,使得天平平衡的方案数, 用dp[i][j]表示挂了前i个砝码时,平衡点为 ...
- POJ 2142 The Balance(exgcd)
嗯... 题目链接:http://poj.org/problem?id=2142 AC代码: #include<cstdio> #include<iostream> using ...
- POJ 3669 Meteor Shower【BFS】
POJ 3669 去看流星雨,不料流星掉下来会砸毁上下左右中五个点.每个流星掉下的位置和时间都不同,求能否活命,如果能活命,最短的逃跑时间是多少? 思路:对流星雨排序,然后将地图的每个点的值设为该点最 ...
- poj 3258 River Hopscotch 【二分】
题目真是不好读,大意例如以下(知道题意就非常好解了) 大致题意: 一条河长度为 L,河的起点(Start)和终点(End)分别有2块石头,S到E的距离就是L. 河中有n块石头,每块石头到S都有唯一的距 ...
- POJ 2393 Yogurt factory【贪心】
POJ 2393 题意: 每周可以生产牛奶,每周生产的价格为Ci,每周需要上交的牛奶量Yi,你可以选择本周生产牛奶,也可选择提前几周生产出存储在仓库中(仓库无限大,而且保质期不考虑),每一周存仓库牛奶 ...
随机推荐
- NSArray中存的是实体时的排序
NSArray中存储的是实体时的排序 by 伍雪颖 NSSortDescriptor *sortDescriptor1 = [NSSortDescriptor sortDescriptorWithKe ...
- hdu 3746 Cyclic Nacklace (KMP求最小循环节)
//len-next[len]为最小循环节的长度 # include <stdio.h> # include <algorithm> # include <string. ...
- innodb 乐观插入因空间不够导致失败,进入悲观插入阶段,这个空间的大小限制
btr_cur_optimistic_insert{ ... /*检查分裂页时是否有足够的空间预留给未来记录的update*/ if (leaf && !zip_size && ...
- java:[1,0] illegal character: \65279 问题
部署项目的时候报下面错误 [java] view plaincopyprint? java:[1,0] illegal character: \65279 java:[1,10] class, int ...
- configuration默认设置
所以 上面的configuration的set可以省略,但是也可以自己改变设置,如下所示:
- vscode部分文件夹无法打开
vscode部分文件夹无法打开,无法正常显示 解决方案:关闭该IDE.找到C:\Users\XX\AppData\Roaming\Code,将Code文件夹删除.重新打开vsCode,即可恢复.但是以 ...
- js获取三天后的日期
js获取三天后的日期 setDate getNowAddTreeFormatDate() { var date = new Date(); date.setDate(date.getDate()+3) ...
- springboot在eclipse实现热部署
eclipse使用spring-tool-suite插件创建springboot项目,项目创建完成后. 选中项目,右键 Spring Tools --> Add Boot Devtools 点 ...
- CMake 手册详解(二十)
SirDigit CMake 手册详解(二十) CMD#51: list 列表操作命令. list(LENGTH <list> <output variable>) list( ...
- HTTP 请求的组成 方法 已经 请求的状态码
HTTP请求是指从客户端到服务器端的请求消息. 包括:消息首行中,对资源的请求方法.资源的标识符及使用的协议.从客户端到服务器端的请求消息包括,消息首行中,对资源的请求方法.资源的标识符及使用的协议. ...