[leetcode]Water and Jug Problem

今天无聊打开了下leetcode,看到一个新题,结论挺简单的,来证明下这个结论吧。
题目链接
题意很简单,就是两个容量分别为a和b的桶,你用他们是否可以量出体积为m的水,只能装满或者倒完。

简化一下题目其实就是下面这个式子是否有解,如果有就是true,没有就是false。

xa + yb = m, m > 0, x,y,a,b都是整数

可以在网上搜索一下这个题的题解都写的很简单m是否被gcd(a,b)整除,如果是就是true,如果不是就false。但是没有人给出了为什么(可能是吧没看到)。

设有集合S = {m = xa + yb, n > 0},d是集合S中最小的元素 d = ua + vb
x也是S中的元素,且 x = qd + r,x不被d整除, 那么 r > 0 and r < d

r = x - qd
  = xa + yb - qd
  = xa + yb -q(ua + vb)
  = (x - qu)a + (y-qb)b

那么r也是属于S,并且r < d和d是最小的元素这个假设矛盾,那么我们可以得到S中的元素一定是最小元素d的倍数,也就是能被d整除

|a|是属于S的,因为a>0,令x=1,y=0, a<0令x=-1,y=0。
同理|b|也属于S。我们题目里面a,b都是大于0的。
d是最小元素,且同时要整除a, b,那么d的范围只能只1 <= d <= gcd(a,b)

我们先得到1<=d<=gcd(a,b)这个结论,我们接下来继续确定d的取值。

d=ua+vb,从gcd(a,b)的定义来看d是能被gcd(a,b)整除的,因为ua能被gcd(a,b)整除,且vb也能
那么d>=gcd(a,b)
1) 1<=d<=gcd(a,b)
2) d >= gcd(a,b)
那么d = gcd(a,b)

所以我们得到S中最小元素d=gcd(a,b)
结合上面的结论得到S中所有元素都是gcd(a,b)的倍数
所以我们只需要看 m 是否被 gcd(a,b)整除就知道xa + yb = m是否有解了。

代码很简单,就懒得贴了。

PS.不知道简书怎么打公式,所以上面证明的格式有点乱

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 【1】7,9,-1,5,( ) A、4;B、2;C、-1;D、-3 分析:选D,7+9=16;9+(-1)=8;(...
    Alex_bingo阅读 19,627评论 1 19
  • 看到照片,相信很多人都熟悉,小学四年级语文中就有一篇文章叫《桂林山水》。那会还小不懂欣赏什么语言优美、简练,也不没...
    鸢尾苏阅读 2,812评论 0 1
  • “助推”是一种深含价值观和目标,同时充分考虑到如何调动资源、制定有效流程、使目标得以实现、使价值观得以坚守的“硬球...
    gyl58365阅读 5,496评论 0 1
  • 我家大宝属于有点鬼马精灵的孩子,大部分的时间里都她非常有主见,坚持自我,并且有点调皮捣蛋。当然偶尔她也会为了讨得父...
    如水年华阅读 4,361评论 0 49

友情链接更多精彩内容