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,你可以选择本周生产牛奶,也可选择提前几周生产出存储在仓库中(仓库无限大,而且保质期不考虑),每一周存仓库牛奶 ...
随机推荐
- STL 笔记(二) 关联容器 map、set、multimap 和 multimap
STL 关联容器简单介绍 关联容器即 key-value 键值对容器,依靠 key 来存储和读取元素. 在 STL 中,有四种关联容器,各自是: map 键值对 key-value 存储,key 不可 ...
- C++ string string string string string string string string string string
一. 初始化 string s1="i love you"; string s2(s1); //把s2初始化为string s1,注意不能写成string s2; s2(s1); ...
- spring中构造函数注入
spring中构造函数注入,简单来说,就是通过beans.xml中,设置对应的值.而且通过bean类中的构造函数进行注入这些值. 文件结构 watermark/2/text/aHR0cDovL2Jsb ...
- Python - scrapy安装中libxml2问题
先到 http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml 下载下面三个库的 whl,然后用pip install 来安装即可 pycurl,lxml,lib ...
- ElasticDownload
https://github.com/eltld/ElasticDownload
- angularjs开发常见问题-2(angularjs内置过滤器)
在angular中内置了几个经常使用的filter,能够简化我们的操作. 过滤器使用 '|' 符号,概念有点相似于linux中的管道. 1.filter (过滤) filter能够依据条件过滤数据.样 ...
- Cocos Console命令总结
1. 工程创建 使用Cocos Console创建工程非常简单,安装完cocos命令之后,只需要在需要创建工程的目标目录下打开终端或命令行工具,输入下面的命令即可: cocos new -l js P ...
- 移动web开发适配rem
移动的meta标签 <meta name="viewport" content="width=device-width, initial-scale=1,user ...
- noip2016前的话[漫谈]
今天是11月15日,离noip2016还剩三天: 今年我也是高二了,回首一下去年的时光,真的仿佛仍在昨天,我甚至现在还清楚的记得,当年那次我们做的每一件事: 星期五,回去与室友告别,得到了祝愿,乘公交 ...
- regmap使用介绍【转】
本文转载自:http://blog.csdn.net/hellowxwworld/article/details/10737569 内核3.1引入一套新的API regmap,目的是提取出关于I2C ...