[哈工大C语言程序设计]水手分叶子背后的数学问题

水手分椰子

    • 1题目描述
    • 2 问题求解
    • 3 文章来源

1题目描述

这里是对题目进行了抽象描述,如果想看原题请点击链接,在题目中的第五题进行查看
https://www.icourse163.org/learn/HIT-69005?tid=1450219455#/learn/ojhw?id=1222236737

设一共有y个物品,每次分成a份,一共分n次,分完后每次拿走c份不继续分,并且剩下b个物品,然后从剩下的a-c份中再拿出d份来继续分发.
如果这么看比较糊涂的话,套用一下五个水手分椰子的题干如下:5个水手,发现一堆椰子,第一个水手将椰子分成等量的5堆,还剩下1个给了猴子.将剩下的4堆混合后重新分成等量的5堆,剩下的一个给了猴子,…,最后一个水手将剩下的椰子分成等量的5堆之后,同样将剩下的一个给了猴子.
显然我们有: a = n = 5 , b = 1 , c = 1 , d = 4 a = n = 5,b = 1,c=1,d=4 a=n=5,b=1,c=1,d=4

2 问题求解

最后一堆剩下的物品一共有 a × x + b a×x+b a×x+b个,这里的 x x x暂且作为未知数.
前一次分堆的结果是 ( a × x + b ) × a / d + b = a 2 × x / d + b × a / d + b (a×x+b)×a/d+b=a^2×x/d+b×a/d+b (a×x+b)×a/d+b=a2×x/d+b×a/d+b
再前一次分堆的结果是
( a 2 × x / d + b × a / d + b ) × a / d + b (a^2×x/d+b×a/d+b)×a/d +b (a2×x/d+b×a/d+b)×a/d+b=
a 3 × x / d 2 + b × ( a / d ) 2 + b × a / d + b a^3×x/d^2+b×(a/d)^2+b×a/d+b a3×x/d2+b×(a/d)2+b×a/d+b
以此类推,我们有

这里用到了 等比数列前n项和

y = a n × x / d n − 1 + b × ( a / d ) n − 1 + . . . + b × ( a / d ) + b y=a^n×x/d^{n-1}+b×(a/d)^{n-1}+...+b×(a/d)+b y=an×x/dn1+b×(a/d)n1+...+b×(a/d)+b
y = [ a n × x + [ a n − 1 b [ ( a / d ) n − 1 + ( a / d ) n − 2 + . . . + ( a / d ) + 1 ] ] / d n − 1 y=[a^n×x+[a^{n-1}b[(a/d)^{n-1}+(a/d)^{n-2}+...+(a/d)+1]]/d^{n-1} y=[an×x+[an1b[(a/d)n1+(a/d)n2+...+(a/d)+1]]/dn1
y = [ x × a n + [ a n − 1 b ( 1 − ( d / a ) n / ( 1 − d / a ) ] ] / d n − 1 y=[x×a^n+[a^{n-1}b(1-(d/a)^n/(1-d/a)]]/d^{n-1} y=[x×an+[an1b(1(d/a)n/(1d/a)]]/dn1

1 − d / a = a − d / a = c / a 1-d/a=a-d/a=c/a 1d/a=ad/a=c/a

最后有
y = a n [ ( x + b / c ) / d n − 1 ] − b d / c y=a^n[(x+b/c)/d^{n-1}]-bd/c y=an[(x+b/c)/dn1]bd/c
如果 b / c b/c b/c不是整数的话,那么无论 x x x取什么值,都不成立.如果 b / c b/c b/c是整数的话,一定存在满足的 x x x,使得
[ ( x + b / c ) / d n − 1 ] = 1 [(x+b/c)/d^{n-1}]=1 [(x+b/c)/dn1]=1从而有最小值.进一步化简有
y = a n − b d / c y=a^n-bd/c y=anbd/c

3 文章来源

http://blog.sina.com.cn/s/blog_a1494e1301013w7v.html
看完这个老师的精彩推理自己整理了一遍,如果有哪些不清楚的地方可以去这个老师的博客看一下.

你可能感兴趣的:(编程题小结专区,算法设计与分析入门,算法)