趣题:用最简单的话来描述一个集合
2007-09-06 11:03
218 查看
定义f(n)的值为将n拆分成若干个2的幂的和,且其中每个数字出现的次数不会超过两次的方案数。规定f(0)=1。
例如,有5种合法的方案可以拆分数字10:1+1+8, 1+1+4+4, 1+1+2+2+4, 2+4+4 和 2+8。因此,f(10)=5。
请用一句最简单的话来描述集合{ f(n)/f(n-1) }。证明你的结论。
注意:答案远比一个递归公式来得精辟,来得巧妙。如果你发现了我们的结论,你会一眼认定它为正确答案。
答案:数列{ f(n)/f(n-1) }以最简形式包含了所有的正有理数。
如果n是奇数(等于2m+1),那么数字1(即2^0)必须出现且只能出现一次。现在的问题就是,2m的拆分方案中有多少个方案不含数字1呢?稍作思考你会立即发现,它就等于f(m),因为m的所有拆分方案的所有数都乘以2后正好与不含1的2m拆分方案一一对应。因此,f(2m+1) = f(m)
如果n是偶数(等于2m),那么数字1要么没有出现,要么恰好出现两次。对于前一种情况,我们有f(m)种可能的方案;第二种情况则有f(m-1)种方案。因此,f(2m) = f(m) + f(m-1)
另外,显然f(k)都是正数。于是,f(2k-1) = f(k-1) < f(k-1)+f(k) = f(2k)
这样,我们可以得到以下三个结论:
结论1:gcd( f(n),f(n-1) ) = 1
证明:对n进行数学归纳。显然gcd( f(1),f(0) ) = gcd(1,1) = 1
假设对于所有小于n的数结论都成立。根据n的奇偶性,下面两式中必有一个成立:
gcd( f(n),f(n-1) ) = gcd( f(2m+1),f(2m) ) = gcd( f(m), f(m)+f(m-1) ) = gcd( f(m),f(m-1) ) = 1
gcd( f(n),f(n-1) ) = gcd( f(2m),f(2m-1) ) = gcd( f(m)+f(m-1), f(m-1) ) = gcd( f(m),f(m-1) ) = 1
结论2:如果f(n+1)/f(n) = f(n'+1)/f(n'),那么n=n'
证明:还是数学归纳法。当max(n,n')=0时结论显然成立,因为此时n=n'=0。
假如对于所有小于n的数结论都成立。由于f(2k-1)<f(2k),那么要想f(n)/f(n-1) = f(n')/f(n'-1),n与n'的奇偶性必须相同,于是可以推出f(m)/f(m-1) = f(m')/f(m'-1),根据归纳我们有m=m',这就告诉我们n=n'。
结论3:对于任何一个有理数r,总存在一个正整数n使得r=f(n)/f(n-1)。
证明:把r写成两个互素的数p和q的比。我们对max(p,q)施归纳。
显然,当p=q=1时结论成立,此时n=1。
不妨设p<q,那么定义r'为p/(q-p)。根据归纳假设,总存在一个数m满足r'=f(m)/f(m-1)。于是r=f(2m+1)/f(2m)。当p>q时同理可证明。
做人要厚道
转贴请注明出处
例如,有5种合法的方案可以拆分数字10:1+1+8, 1+1+4+4, 1+1+2+2+4, 2+4+4 和 2+8。因此,f(10)=5。
请用一句最简单的话来描述集合{ f(n)/f(n-1) }。证明你的结论。
注意:答案远比一个递归公式来得精辟,来得巧妙。如果你发现了我们的结论,你会一眼认定它为正确答案。
答案:数列{ f(n)/f(n-1) }以最简形式包含了所有的正有理数。
如果n是奇数(等于2m+1),那么数字1(即2^0)必须出现且只能出现一次。现在的问题就是,2m的拆分方案中有多少个方案不含数字1呢?稍作思考你会立即发现,它就等于f(m),因为m的所有拆分方案的所有数都乘以2后正好与不含1的2m拆分方案一一对应。因此,f(2m+1) = f(m)
如果n是偶数(等于2m),那么数字1要么没有出现,要么恰好出现两次。对于前一种情况,我们有f(m)种可能的方案;第二种情况则有f(m-1)种方案。因此,f(2m) = f(m) + f(m-1)
另外,显然f(k)都是正数。于是,f(2k-1) = f(k-1) < f(k-1)+f(k) = f(2k)
这样,我们可以得到以下三个结论:
结论1:gcd( f(n),f(n-1) ) = 1
证明:对n进行数学归纳。显然gcd( f(1),f(0) ) = gcd(1,1) = 1
假设对于所有小于n的数结论都成立。根据n的奇偶性,下面两式中必有一个成立:
gcd( f(n),f(n-1) ) = gcd( f(2m+1),f(2m) ) = gcd( f(m), f(m)+f(m-1) ) = gcd( f(m),f(m-1) ) = 1
gcd( f(n),f(n-1) ) = gcd( f(2m),f(2m-1) ) = gcd( f(m)+f(m-1), f(m-1) ) = gcd( f(m),f(m-1) ) = 1
结论2:如果f(n+1)/f(n) = f(n'+1)/f(n'),那么n=n'
证明:还是数学归纳法。当max(n,n')=0时结论显然成立,因为此时n=n'=0。
假如对于所有小于n的数结论都成立。由于f(2k-1)<f(2k),那么要想f(n)/f(n-1) = f(n')/f(n'-1),n与n'的奇偶性必须相同,于是可以推出f(m)/f(m-1) = f(m')/f(m'-1),根据归纳我们有m=m',这就告诉我们n=n'。
结论3:对于任何一个有理数r,总存在一个正整数n使得r=f(n)/f(n-1)。
证明:把r写成两个互素的数p和q的比。我们对max(p,q)施归纳。
显然,当p=q=1时结论成立,此时n=1。
不妨设p<q,那么定义r'为p/(q-p)。根据归纳假设,总存在一个数m满足r'=f(m)/f(m-1)。于是r=f(2m+1)/f(2m)。当p>q时同理可证明。
做人要厚道
转贴请注明出处
相关文章推荐
- 利用泛型自己定义一个简单的集合
- 制作一个简单的图片浏览器 对应图片的张数,与描述,还有图片的缩放
- 黑马程序员--反射--实现一个简单的集合操作框架
- 写一个简单的按钮集合
- 利用C3P0数据源来作连接池,简单的写一个数据库操作来描述分层思想
- 简单思考如何编写描述一个模块
- 运算器执行的指令集是一个精心定义的数目十分有限的简单指令集合
- 描述一个运行时间为O(nlgn)的算法,使之能在给定一个由n个整数构成的集合S和另一个整数 X 时,判断出S中是否存在有两个其和刚好等于 X 的元素。
- 利用集合实现一个简单的购物商城
- 使用List集合写的一个简单的学生信息管理系统!
- 电报加密 描述: 发送电报保密是一项重要的工作,尤其是在军事领域,所以,为了安全的需要常常会对发送的内容进行加密,然后,接收方再进行解密,这样就达到了安全的需要。 本次我们完成一个简单的对字母加密程
- 最近在论坛里面看到一个算法题,简单描述确有些离奇(微软面试题)。。
- 简单描述如何安装配置一个apache开源版hadoop,只描述即可,无需列出完整步骤,能列出步骤更好
- Compliers-一个编译器的各个步骤简单描述
- 简单的一个bug描述
- 简单描述JavaScript中的数组、集合及效率(初学者必看)
- 一个简单的系统配置文件使用DTD和XSD两种方式描述
- 2.3-7 描述一个运行时间为Θ(nlgn)的算法,给定n个整数的集合S和另一个整数x,该算法能确定S中是否存在两个其和刚好为x的元素
- java中集合的运用,实现一个简单的购物程序
- 描述一个运行时间为Θ(nlgn)的算法,给定n个整数的集合S和另一个整数x,该算法能确定S中是否存在两个其和刚好为x的元素