人和猴子分配椰子问题
2009-05-30 12:07
232 查看
五男一猴子在一个岛屿上。他们度过了第一晚采收椰子。在夜间,一名男子醒来,并决定拿走他那一份椰子。他分为五个份。椰子剩下来一个,他把它给猴子,然后藏起他的份额,回去睡觉。
不久另一名男子醒来后,也做了同样的事情。经过划分为5份椰子,剩余一个给猴子,拿走自己的,又回到床上。第三,第四和第五名男子一样。第二天早上,他们都醒了,他们剩下的椰子分成五个平摊。这一次没有椰子被遗留下来的。
问题要输入一个N,表示椰子个数,让求P,最大的人数能满足这个条件,分P次,每次正好剩一个给猴子,最后一次省的个数正好是人数的倍数
f(n <0>) = n;
f(n <i+1>,p) = (f(n <i>)-1) * (p-1) / p; 0 <= i < p;
f(n <p>,p) = pm,m 为整数。
消去f(n <p>,p)有
pm = n * ((p-1)/p)^p - Sum( ((p-1)/p)^i, i=1:p)
pm = n * ((p-1)/p)^p + (p - 1)( ((p-1)/p)^p - 1 )
考察 ((p-1)/p)^p 的函数图像可知: 1、p < 5 时导数值很大,增长最快。
2、p >= 4 时,值过 0.3
3、p = 24 时,值过 0.36
4、p 直到百万,值仍不过 0.3679
因此可认为 ((p-1)/p)^p < 0.37,则
pm < 0.37n - 0.63(p-1)
当 m = 1 时,p 最大,有
1.63p < 0.37n + 0.63,忽略常数项
可得 p < 0.227n
所以 p 的取值范围是很小的。事实上,m 可能要比 1 大得多
那我们来看看,当 m = 1 的时候,p 与 n 的关系,这里面 p 与 n 都应是整数
p = 1 : 1 : 3*1e7
则当 p = 2 的时候 n = 11 为整数。也就是说,测试三千万个p,当 m = 1 时,只有 p = 2 n = 11 满足条件
也即 m = 1 只有一个特例成立。
更一般的情况 m > 1,比如说 m = 2 时呢?
可得 p < 0.14n,更小了。
当 m = 2 时,p 与 n 的关系:
p = 1 : 1 : 3*1e7
则当 p = 2, 3, 24283182 时,n = 19, 25, 173742417 为整数。
m = 3 呢?
可得 p < 0.102n,更小。
当 p = 2, 18138042 时,n = 27, 179079202 为整数。
m = 4 呢?
可得 p < 0.0799n,小吧。
当 p = 2, 14384493, 17952777 时,n = 35, 181121042, 226050766 为整数
m = 5 呢?
可得 p < 0.066n
当 p = 2 时,n = 43 为整数
m = 6 呢?
可得 p < 0.056n
当 p = 2、17275954、29680590 时,n = 51、311450436、535080878
m = 7
p < 0.0485n
p = 2、14333173、17300311、26742099 时,n = 59、297359666、358916666、554798405
不测了,测试中大数多情况 p 为 2 人的居多,或者,岛上有上千万的人分数百亿的椰子……那些椰子放哪儿都是个问题。
最后测一个 m = 100
p < 0.0037n,这也太小了吧,千分之三了。
p = 2 4588077 5872121 7366469 9074646 11807665 15939607 18255034 20749254 22115823 22955497 23585595 26559095 27414265 27642455 27929303 29690190
n = 803 1255052379 1606298075 2015071687 2482337469 3229945155 4360223282 4993600150 5675885221 6049705324 6279395176
还是有 2 个人的情况。
结论:让 p 取到三千万人之内来测满足p与n同为整数的情况。m为最后一次每人分得的椰子数,须为整值。p 为 2 时多。测试给出了几种可能性。由公式可得,p 的遍历范围可以相比n来说很小。有的人从 n - 2 开始遍历,其实,从结果可以看出,几乎99%的情况是在做无用功。
这是一道ACM题,原贴见
http://topic.csdn.net/u/20090530/10/dc60c446-c153-42e7-a39d-597d1f307773.html
我在原贴的回复中说错了,在此文中更正。
测试代码:
不久另一名男子醒来后,也做了同样的事情。经过划分为5份椰子,剩余一个给猴子,拿走自己的,又回到床上。第三,第四和第五名男子一样。第二天早上,他们都醒了,他们剩下的椰子分成五个平摊。这一次没有椰子被遗留下来的。
问题要输入一个N,表示椰子个数,让求P,最大的人数能满足这个条件,分P次,每次正好剩一个给猴子,最后一次省的个数正好是人数的倍数
f(n <0>) = n;
f(n <i+1>,p) = (f(n <i>)-1) * (p-1) / p; 0 <= i < p;
f(n <p>,p) = pm,m 为整数。
消去f(n <p>,p)有
pm = n * ((p-1)/p)^p - Sum( ((p-1)/p)^i, i=1:p)
pm = n * ((p-1)/p)^p + (p - 1)( ((p-1)/p)^p - 1 )
考察 ((p-1)/p)^p 的函数图像可知: 1、p < 5 时导数值很大,增长最快。
2、p >= 4 时,值过 0.3
3、p = 24 时,值过 0.36
4、p 直到百万,值仍不过 0.3679
因此可认为 ((p-1)/p)^p < 0.37,则
pm < 0.37n - 0.63(p-1)
当 m = 1 时,p 最大,有
1.63p < 0.37n + 0.63,忽略常数项
可得 p < 0.227n
所以 p 的取值范围是很小的。事实上,m 可能要比 1 大得多
那我们来看看,当 m = 1 的时候,p 与 n 的关系,这里面 p 与 n 都应是整数
p = 1 : 1 : 3*1e7
则当 p = 2 的时候 n = 11 为整数。也就是说,测试三千万个p,当 m = 1 时,只有 p = 2 n = 11 满足条件
也即 m = 1 只有一个特例成立。
更一般的情况 m > 1,比如说 m = 2 时呢?
可得 p < 0.14n,更小了。
当 m = 2 时,p 与 n 的关系:
p = 1 : 1 : 3*1e7
则当 p = 2, 3, 24283182 时,n = 19, 25, 173742417 为整数。
m = 3 呢?
可得 p < 0.102n,更小。
当 p = 2, 18138042 时,n = 27, 179079202 为整数。
m = 4 呢?
可得 p < 0.0799n,小吧。
当 p = 2, 14384493, 17952777 时,n = 35, 181121042, 226050766 为整数
m = 5 呢?
可得 p < 0.066n
当 p = 2 时,n = 43 为整数
m = 6 呢?
可得 p < 0.056n
当 p = 2、17275954、29680590 时,n = 51、311450436、535080878
m = 7
p < 0.0485n
p = 2、14333173、17300311、26742099 时,n = 59、297359666、358916666、554798405
不测了,测试中大数多情况 p 为 2 人的居多,或者,岛上有上千万的人分数百亿的椰子……那些椰子放哪儿都是个问题。
最后测一个 m = 100
p < 0.0037n,这也太小了吧,千分之三了。
p = 2 4588077 5872121 7366469 9074646 11807665 15939607 18255034 20749254 22115823 22955497 23585595 26559095 27414265 27642455 27929303 29690190
n = 803 1255052379 1606298075 2015071687 2482337469 3229945155 4360223282 4993600150 5675885221 6049705324 6279395176
还是有 2 个人的情况。
结论:让 p 取到三千万人之内来测满足p与n同为整数的情况。m为最后一次每人分得的椰子数,须为整值。p 为 2 时多。测试给出了几种可能性。由公式可得,p 的遍历范围可以相比n来说很小。有的人从 n - 2 开始遍历,其实,从结果可以看出,几乎99%的情况是在做无用功。
这是一道ACM题,原贴见
http://topic.csdn.net/u/20090530/10/dc60c446-c153-42e7-a39d-597d1f307773.html
我在原贴的回复中说错了,在此文中更正。
测试代码:
>> p = 1 : 1 : 3 * 1e7; >> n = np ( p, 100); >> r = find ( n == round ( n )); >> r >> n(r) // np.m function y = np ( x, m ) n = length(x); mm = m + 1; y = zeros ( 1, n ); for i = 1 : 1 : n xx = x ( i ); y(i) = ( mm * xx - 1 ) * (( xx / (xx - 1) )^xx) + 1 - xx; end end
相关文章推荐
- 解决GridLayout API level小于21时平均分配行列的问题
- 内存分配问题
- MVC权限管理系统dwpro项目分配按钮没有显示的问题
- 猴子吃桃问题的一种解答
- 猴子吃桃问题
- C++之类的内存分配问题
- nyoj_324猴子吃桃问题
- PHP变量内存分配问题记录整理
- 浅析C++类在内存中分配的大小问题
- (转)!!频繁分配释放内存导致的性能问题的分析 --(附)malloc分配原理浅析 mmap关注焦点 如何优化分配内存
- 内存分配问题
- 南阳理工学院OJ_324_猴子吃桃问题
- 数据结构 学习笔记之:结构体及其所定义变量的内存分配的问题
- VC中结构体内存分配问题透析(sizeof)
- JAVA的内存分配与释放问题
- 自定义分区随机分配解决数据倾斜的问题
- 886A. ACM ICPC#均值分配问题(暴力)
- 内存分配问题
- 内存5个区的分配问题(转)
- 猴子吃桃问题: 猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个 第二天早上又将剩 * 下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下 的一半零一个。到第10天早上想再吃