设r为桌上剩下的火柴棒数量(开始时奇数,中间可以是偶数),当前轮到某个人取火柴,h为他手上的火柴棒,0表示偶数,1表示奇数,y为他的最终的火柴棒数量,0表示偶数,1表示奇数,定义函数f(r,h),如果此人最终能够获得偶数根火柴棒则f(r,h)的值为0,否则为1。

容易得到:

桌上r=1根,手上h根,取1根,因此f(1,h)=1+h;

桌上r=2根,手上h根,如果h为0,则取2根,否则取1根(最后一根留给对手),因此f(2,h)=0;

桌上r=3根,手上h根,如果h为0,则取2根(最后一根留给对手),否则取3根,因此f(3,h)=0;;

一般地,对于r>=4,如果取k根,1<=k<=3,则轮到对手从r-k根火柴棒中取1~3根火柴,由于火柴棒总数是奇数,因此此时对手手上的火柴棒奇偶状况是(1+r+h),则对手的f值为f(r-k,1+r+h),自己的f值则为1+f(r-k,1+r+h),只要k=1,2,3中有一个1+f(r-k,1+r+h)为偶数,那么f(r,h)就是偶数,因此:

f(r,h) = (1+ f(r-1,1+r+h))*( 1+ f(r-2,1+r+h))*(

1+f(r-3,1+r+h)),对于任意r>3;

特别地,

f(2n,h) = (1+f(2n-1,1+h))*( 1+f(2n-2,1+h))*(

1+f(2n-3,1+h)),对于任意n>1;

f(2n+1,h) = (1+f(2n,h))*( 1+f(2n-1,h))*(

1+f(2n-2,h)),对于任意n>1;

由此可以得到:

f(4,h) = (1+ f(3,1+h))*( 1+f(2,1+h))*( 1+f(1,1+h)) =

(1+0)*(1+0)*(1+1+1+h) = 1+h;

f(5,h) = (1+f(4,h))*(1+f(3,h))*(1+f(2,h)) = (1+1+h)*(1+0)*(1+0)

= h;

f(6,h) = (1+ f(5,1+h))*( 1+ f(4,1+h))*( 1+ f(3,1+h)) =

(1+1+h)*(1+1+1+h)*(1+0) = h(1+h) = 0;

f(7,h) = (1+f(6,h))*(1+f(5,h))*(1+f(4,h)) = (1+0)*(1+h)*(1+1+h)

= h*(h+1) = 0;

f(8,h) = (1+ f(7,1+h))*( 1+ f(6,1+h))*( 1+ f(5,1+h)) =

(1+0)*(1+0)*(1+1+h) = h;

f(9,h) = (1+f(8,h))*(1+f(7,h))*(1+f(6,h)) = (1+h)*(1+0)*(1+0) =

1+h;

......

如果开始时桌上有9跟火柴,那么对于先取火柴的人,f(9,0)=1,因此先取火柴的人最终得到的火柴总数是奇数(假设对方不犯错误)。

事实上,可以有如下的公式:对于任意n>=1,

f(8n+1) = 1+h;

f(8n+2) = 0;

f(8n+3) = 0;

f(8n+4) = 1+h;

f(8n+5) = h;

f(8n+6) = 0;

f(8n+7) = 0;

f(8n+8) = h;

上述公式可以用数学归纳法证明:

n=1时上述公式成立,假设n时公式成立,现在要证明对n+1公式成立:

f(8(n+1)+1,h) = (1+f(8n+8,h))*(1+f(8n+7,h))*(1+f(8n+6,h)) =

(1+h)*(1+0)*(1+0) = (1+h)*1*1;

f(8(n+1)+2,h) =

(1+f(8(n+1)+1,1+h))*(1+f(8(n+1),1+h))*(1+f(8n+7,1+h)) =

(1+1+1+h)*(1+1+h)*(1+0) = (1+h)h*1 = 0;

f(8(n+1)+3,h) =

(1+f(8(n+1)+2,h))*(1+f(8(n+1)+1,h))*(1+f(8(n+1),h)) =

(1+0)*(1+1+h)*(1+h) = 1*h(1+h) = 0; (因为h和h+1中必有一个是偶数)

f(8(n+1)+4,h) = (1+ f(8(n+1)+3,1+h))*( 1+ f(8(n+1)+2,1+h))*( 1+

f(8(n+1)+1,1+h)) = (1+0)*(1+0)*(1+1+1+h) = 1*1*(1+h) = 1+h;

f(8(n+1)+5,h) =

(1+f(8(n+1)+4,h))*(1+f(8(n+1)+3,h))*(1+f(8(n+1)+2,h)) =

(1+1+h)*(1+0)*(1+0) = h*1*1 = h;

f(8(n+1)+6,h) =

(1+f(8(n+1)+5,1+h))*(1+f(8(n+1)+4,1+h))*(1+f(8(n+1)+3,1+h)) =

(1+1+h)*(1+1+1+h)*(1+0) = h(1+h)*1 = 0;

f(8(n+1)+7,h) =

(1+f(8(n+1)+6,h))*(1+f(8(n+1)+5,h))*(1+f(8(n+1)+4,h)) =

(1+0)*(1+h)*(1+1+h) = 1*(1+h)*h = 0;

f(8(n+1)+8,h) =

(1+f(8(n+1)+7,1+h))*(1+f(8(n+1)+6,1+h))*(1+f(8(n+1)+5,1+h)) =

(1+0)*(1+0)*(1+1+h) = h;

也就是说,如果开始时桌上是奇数根火柴,假如是8n+1(9,17,25…),那么先取火柴的人最终得到的火柴棒总数是奇数(假设对手不犯错误),其他情况(8n+3,8n+5,8n+7)下,先取火柴的人最终得到的火柴棒总数是偶数。

另外,上述公式其实也提供了制胜或最优的取法,例如,假设到某一步轮到你取火柴,你手上有h根火柴,桌上剩下r根火柴,那么你应该取几根火柴?假设r=8n+6,根据上述公式:

f(8(n+1)+6,h) =

(1+f(8(n+1)+5,1+h))*(1+f(8(n+1)+4,1+h))*(1+f(8(n+1)+3,1+h)) =

(1+1+h)*(1+1+1+h)*(1+0) = h(1+h)*1 = 0;

此次取3根火柴的结果是(1+f(8(n+1)+3,1+h))=1,因此不是正确的取法,如果手上的火柴数h是偶数,那么取1根火柴,否则取2根火柴。r为其他数的话,以此类推。

C语言 现有21根火柴,两个轮流取,一种解法:小学生奥数题:9根火柴棒,两个人轮流取,每次只能取1,2或3根,取完为止,总数为偶数者为胜...相关推荐

  1. c语言 奥数题目及答案,科学网—C语言做一道小学奥数题 - 康建的博文

    见过一道小学奥数题,记得题目是:从5月1日到7月1日数字0-9无重复的时间有多少个?(如0512142804是05月12日14:28:04,其中0.1.4有重复, 0526174839无重复). 大概 ...

  2. c语言 奥数题目及答案,科学网-C语言做一道小学奥数题-康建的博文

    见过一道小学奥数题,记得题目是:从5月1日到7月1日数字0-9无重复的时间有多少个?(如0512142804是05月12日14:28:04,其中0.1.4有重复, 0526174839无重复). 大概 ...

  3. c语言分苹果程序,小朋友学C语言(14):分苹果(小学奥数题)

    题目 有两堆一样多的苹果,老师将第一堆苹果分给男生,每人4个,最后剩下6个. 老师又将第二堆苹果分给女生,每个5个,最后剩下5个. 已知男生比女生多1人. 求:女生有多少人?男生有多少人?苹果有多少个 ...

  4. c语言小孩分苹果问题答案忘了,大师网-小朋友学C语言(13):分苹果(小学奥数题)...

    题目 有两堆一样多的苹果,老师将第一堆苹果分给男生,每人4个,最后剩下6个. 老师又将第二堆苹果分给女生,每个5个,最后剩下5个. 已知男生比女生多1人. 求:女生有多少人?男生有多少人?苹果有多少个 ...

  5. c语言水仙桃树编程,给找十道奥数题

    欢迎访问少儿编程网(http://www.pxcodes.com)1.一条路长100米,从头到尾每隔10米栽1棵梧桐树,共栽多少棵树? 路分成100÷10=10段,共栽树10+1=11棵. 2.12棵 ...

  6. python两个数组合并、找出中位数_leetcode刷题记录-找出这两个有序数组的中位数(python版本)...

    谨以此文记录一下自己刷题的过程,虽然技术能力一般,相信刷完整套题目自己的编程能力定会有提高,代码都是个人创作,不一定是最好的,仅供参考和交流 给定两个大小为 m 和 n 的有序数组 nums1 和 n ...

  7. C语言题目地图上有m个城市,序号依次为1,2,3....m,刚开始你在1,若每次只能从当前城市去往当前序号加1或者加3的城市,要到达m城市(m3),有多少种走法

    地图上有m个城市,序号依次为1,2,3....m,刚开始你在1,若每次只能从当前城市去往当前序号加1或者加3的城市,要到达m城市(m>3),有多少种走法 要想到达m,则前一个应该是m - 1或者 ...

  8. c语言 奥数题目及答案,小学奥数题C语言解法

    朋友给我发了一个小学的奥数题,尝试解了一会儿没有找到方法,于是编辑了一个小程序解决了 上面的是题目 下面的是实现的代码,仅做参考 #include #ifdef __cplusplus extern ...

  9. 这两天学会了怎么给线上锡,怎么剥线,怎么焊接两根线。

    这两天学会了怎么给线上锡,怎么剥线,怎么焊接两根线. 剥线有专门的剥线工具,很方便. 还有焊接两根线你之前没有很好的解决方案现在知道了对吧. .

最新文章

  1. 《Adobe Fireworks CS6中文版经典教程》——1.2工具面板
  2. 李飞飞点赞「ARM」:一种让模型快速适应数据变化的元学习方法 | 开源
  3. 计算机无法查找新硬件,电脑弹出新硬件向导怎么办_win7开机显示找到新的硬件向导的解决方法...
  4. python的模块提供了许多文件管理方法_学会这几招,轻松掌握Python文件管理
  5. Android SQLite保存多个选择题的选择信息
  6. 春运男子持刀强行劫走17张卧铺票 ....
  7. 关于luci的几个问题一
  8. 【POJ】【最小生成树】1789 Truck History
  9. linux小技巧--vim下多行注释和取消多行注释
  10. 再见了,mover。当打之年,感恩相遇,感恩联汇,感恩一切。
  11. Linux 进程间通信的六种机制
  12. linux 有道词典无法屏幕取词,有道词典怎么开启屏幕取词功能 有道词典开启屏幕取词功能方法...
  13. dtft性质及证明_数字信号处理1 时域分析和DTFT.pptx
  14. 全流程OA系统集成对接案例实例
  15. 图形2.5 Bump Map的改进(凹凸映射)
  16. “天鹅”类谜解大全!-
  17. 如何免费下载B站视频!!!实测可用!!!
  18. xlsx表格怎么筛选重复数据_excel表格如何筛选重复数据 在Excel表格的两列数据中提取不重复值的四种方法...
  19. 【翻译】开发人员的技术写作
  20. 6. Lots of Parabolas

热门文章

  1. 跨国药企在中国 | 赛诺菲来优时胰岛素生产基地落地北京;拜耳启动处方药北京工厂产能提升项目...
  2. sql月度分组_SQL语句按年 月 日 季度分组
  3. 求解(树的子结构问题-何海涛100题)
  4. 2019年北京移动电信联通校园卡200打一年300打两年套餐对比
  5. 记录一次nodejs爬取《17吉他》所有吉他谱
  6. 目标检测 YOLOv5 - 如何提高模型的指标,提高精确率,召回率,mAP等
  7. 计算机科学与技术发表文章,计算机科学与技术学院粆倩文老师的文章在顶级学术期刊IEEE TVCG上发表...
  8. element is not attached to the page document报错解决办法
  9. 专门为u盘设计的linux系统
  10. 书呆子rico_Excel书呆子的夏季赠品