n个容器取油问题再探
在 韩信分油问题的拓展分析 里,最后给出了一般性的结论,即:
用 n (n > 1) 个不规则无刻度的容器从一个无穷大的油桶里取油,这些容器容量都为整数升,分别记为 a1, a2, ..., an ,且满足(a1, a2, ..., an) = 1。则所能取得的整数升油量为0到s范围内的全体整数,s = a1+a2+...+an。
为了证明这个一般性结论,给出了一个未能证明的引理,即:
引理 若n个正整数满足 (a1, a2, ..., an) = 1,并记 s为这n个数的和,则有 min{ (a1, s), (a2, s), ..., (an, s) } = 1。
昨天晚上和葛永超、walls老师进一步探讨了一下。永超首先找到了一个 n=4 的反例:2, 3, 4, 9。
2+3+4+9 = 18, (2, 18) = 2, (3, 18) = 3, (4, 18) = 2, (9, 18)= 9,确实是反例,因此上述“引理”被证伪。
随后,我想到把这个被证伪的“引理”的结论稍作弱化处理,得到如下调整的引理:
引理 若n (n > 1) 个正整数满足 (a1, a2, ..., an) = 1,把这 n 个数分成两组,则至少存在一种分法,使得每组数的和,分别记为 s1 和 s2,满足 (s1, s2) = 1。
这样 2, 3, 4, 9 就不是反例了,因为 (2+3, 4+9) = 1。若这个引理成立,一样可以由这个引理把容器数 n > 2 的取油问题等价为容器数 n = 2 的取油问题。
我指出若能找出三个数的反例,这个调整后的引理也就不成立;和walls老师确认这个弱化后的结论证明起来依然很困难后就休息了。
今早一起来,看到了永超提供的三个数的反例:6, 15, 49。
6+15+49 = 70,(6, 70) = 2, (15, 70) = 5, (49, 70) = 7,的确是三个数的反例,调整后的“引理”也被证伪。
琢磨了一下这个反例的构造规律,发现其中有一组基础数:2, 5, 7,满足两个较小的数之和等于较大的数(即 2+5=7),这三个基础数的最小公倍数为2·5·7=70;据此要构造反例的三个数分别记为 a, b, c,令 c = 7·7,并令 a+b+c = 2·5·7,于是 a+b = (2·5 - 7)·7 = 3·7,令 a = 2·3 及 b = 5·3,就得到了 6, 15, 49 这一组反例。
同样,选 2, 7, 9为基础数,可以得到另一组反例:10, 35, 81。事实上,只要选2作为基础数,再选两个相邻的奇数为基础数,按上述方法一般都可以构造出一组三个数的反例(唯一的例外是2, 1, 3这一组基础数)。以 2, 3, 5 为基础数,可得最小的一组三个数的反例 2,3, 25。
也可以使用2以外的偶数作基础数,比如由 3, 4, 7 得到的反例是 15, 20, 49。
再来考虑多于三个数的反例,比如在三个数的反例 15, 20, 49 基础上,添加一个数,能否构造出四个数的反例。
15 = 3*5, 20 = 2*2*5, 49 = 7*7
又由于 15+20+49 = 84 = 2*2*3*7
所以可以构造第四个数为 2*3*7 = 42
这样就得到了4个数15, 20, 42, 49。这4个数的和为126,4个数中任意一个数和126都不互素,且
由 (42+15, 126) = 3, (42+20, 126) = 2, (42+49, 126) = 7,可知 15, 20, 42, 49 这一组数构成了一组4个数的反例。
易知更多个数的反例只需补充上相应数量的42或42的任意倍数即可。至此可知,上面所谓的“引理”已经没有可以调整的余地和价值。这也说明上面的n个容器取油的一般性结论,如果成立的话,还需另辟蹊径证明。
对于n个容器取油的一般性结论,我依然不能证明或证伪。以下仅就上述几个反例的情形做一些具体的探索。
先看 n = 3 的情形,假设三个容器的容量分别为 6, 15, 49 升,由上面的分析已经知道这三个容器不能分成两组,使得各组的复合容量数互素,即无法等价成 n = 2 的情形。但由 (15, 49) = 1 可知由容量分别为 15 和 49 升的两个容器取得的整数升油数为 0 到 15+49 = 64 之间的全体整数。而 6+15+49 = 70,三个容器都装满可取得70升油,因此只需列举出65 到 69 升油也都可以用三个容量分别为6, 15, 49 升的容器取得,0 到 70 之间的全体整数升油便都能取得。
由 (15, 49) = 1,用49升和15升的容器可以倒腾出 1 升的油量,用6升的容器盛放这1升油,并把15升和49升的容器倒满油,于是就得到了 1+15+49 = 65 升油;
同样地,由 (15, 49) = 1,用49升和15升的容器可以倒腾出 2 升的油量,用6升的容器盛放倒腾出的2升油,并把15升和49升的容器倒满油,于是就得到了 2+15+49 = 66 升油;
用49升和15升的容器还可以倒腾出 3、4、5 升的油量,用同样的方法,可以依次得到67、68、69升油。
再看一个 n = 4 的情形,假设4个容器的容量分别为 15, 20, 42, 49 升,由上面的分析已经知道这4个容器不能分成两组,使得各组的复合容量数互素,即无法等价成 n = 2 的情形。但由 (20, 49) = 1 可知由容量分别为 20 和 49 升的两个容器取得的整数升油数为 0 到 20+49 = 69 之间的全体整数。而 15+20+42+49 = 126,还需要考察 70到125之间的每个整数是否能取到。
15+42 = 57,于是由 20 升 和 49 升的容器倒腾出的 1 到 56 升的油量可以倒腾到 15 升和 42 升这两个容器里存放,再把 20 升 和 49 升的容器倒满,就能依次取得 69+1=70 到 69+56=125 升油。
以上两个具体例子的考察说明,这两个所谓反例只是上面所谓“引理”的反例,而不是n个容器取油的一般性结论的反例。
n个容器取油问题再探的更多相关文章
- 【再探backbone 02】集合-Collection
前言 昨天我们一起学习了backbone的model,我个人对backbone的熟悉程度提高了,但是也发现一个严重的问题!!! 我平时压根没有用到model这块的东西,事实上我只用到了view,所以昨 ...
- c++再探string之eager-copy、COW和SSO方案
在牛客网上看到一题字符串拷贝相关的题目,深入挖掘了下才发现原来C++中string的实现还是有好几种优化方法的. 原始题目是这样的: 关于代码输出正确的结果是()(Linux g++ 环境下编译运行) ...
- 再探jQuery
再探jQuery 前言:在使用jQuery的时候发现一些知识点记得并不牢固,因此希望通过总结知识点加深对jQuery的应用,也希望和各位博友共同分享. jQuery是一个JavaScript库,它极大 ...
- 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT)
再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT) 目录 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Blueste ...
- LWIP再探----内存堆管理
LWIP的内存管理主要三种:内存池Pool,内存堆,和C库方式.三种方式中C库因为是直接从系统堆中分配内存空间且易产生碎片因此,基本不会使用,其他两种是LWIP默认全部采用的方式,也是综合效率和空间的 ...
- ViewPager+Fragment再探:和TAB滑动条一起三者结合
Fragment前篇: <Android Fragment初探:静态Fragment组成Activity> ViewPager前篇: <Android ViewPager初探:让页面 ...
- [老老实实学WCF] 第五篇 再探通信--ClientBase
老老实实学WCF 第五篇 再探通信--ClientBase 在上一篇中,我们抛开了服务引用和元数据交换,在客户端中手动添加了元数据代码,并利用通道工厂ChannelFactory<>类创 ...
- Spark Streaming揭秘 Day7 再探Job Scheduler
Spark Streaming揭秘 Day7 再探Job Scheduler 今天,我们对Job Scheduler再进一步深入一下,对一些更加细节的源码进行分析. Job Scheduler启动 在 ...
- 再探ASP.NET 5(转载)
就在最近一段时间,微软又有大动作了,在IDE方面除了给我们发布了Viausl Studio 2013 社区版还发布了全新的Visual Studio 2015 Preview. Visual Stud ...
随机推荐
- P2490 [SDOI2011]黑白棋
P2490 [SDOI2011]黑白棋 题意 一个 \(1*n\) 的棋盘上,A 可以移动白色棋子,B 可以移动黑色的棋子,其中白色不能往左,黑色不能往右.他们每次操作可以移动 1 到 \(d\) 个 ...
- 一文说清OpenCL框架
背景 Read the fucking official documents! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: 对不 ...
- 【阅读笔记】Java核心技术卷一 #2.Chapter4
4 对象和类 4.1 面向对象程序设计概述(略) 4.2 使用预定义类 java.time.LocalDate static LocalDate now(); static LocalDate of( ...
- 大数据学习(23)—— ZooKeeper实战
本片介绍两方面内容,一方面是命令行操作,另一方面是Java调用API. ZooKeeper集群环境的搭建在Hadoop集群搭建里已经讲过了,这里不再赘述,本篇内容基于zk3.5.8. 这里补充一点,除 ...
- 「必知必会」最细致的 ArrayList 原理分析
从今天开始也正式开 JDK 原理分析的坑了,其实写源码分析的目的不再是像以前一样搞懂原理,更重要的是看看他们编码风格更进一步体会到他们的设计思想.看源码前先自己实现一个再比对也许会有不一样的收获! ...
- Linux之cat tail less常见用法
1.cat 通常查找出错误日志 cat error.log | grep 'foo' , 这时候我们还有个需求就是输出当前这个日志的前后几行: cat error.log | grep -C 10 ' ...
- 一张图说明 iaas paas saas的区别
图片来源:https://www.bilibili.com/video/BV1QJ411S7c4 P2 云服务的三种模式 1laaS(基础设施即服务) laas(Infrastructure as ...
- 常见web中间件漏洞(四)Tomcat漏洞
这部分好久没写了,继续更新web中间件漏洞思路整理(不复现) ,争取...整理完 前几篇指路链接: nginx: https://www.cnblogs.com/lcxblogs/p/13596239 ...
- SynchronizedMap和ConcurrentHashMap有什么区别
SynchronizedMap实现上在调用Map的所有方法是,对整个map进行了同步! public V put(K key, V value) { synchronized (mutex) {ret ...
- centos7上安装redis6-0-5
下载tar包 wget http://download.redis.io/releases/redis-6.0.5.tar.gz 解压tar包 tar -zxvf redis-6.0.5.tar.gz ...