聪明的学生问题

第一次碰见这种诡异的问题是大一下学期在看黑书的时候看到的,内容是这样的:

一位教授逻辑学的教授有三名非常善于推理且精于心算的学生A、B、C。有一天,教授给他们三人出了一道题:教授在每个人的脑门上贴了一张纸条并告诉他们,每个人的纸条上都写着一个正整数,且某两个数的和等于第三个。于是每个学生都能看见贴在另外两个同学头上的整数,却看不见自己的数。
这时,教授先对A学生发问了:“你能猜出自己的数吗?”,A回答:“不能。”,教授又转身问学生B:“你能猜出自己的数吗?”,B想了想,也回答:“不能”,教授再问学生C同样的问题,C思考片刻,摇摇头说不能。接着教授又重新问A同样的问题,再问B和C……经过若干次提问之后,当教授再次询问某人时,此人突然露出了得意的笑容,把贴在自己头上的那个数准确无误的报了出来。
现在如果告诉你,教授在第N次提问时,轮到回答问题的那个人猜出了贴在自己头上的数是M,你能推断出另外两个学生头上贴的是什么数吗?
提示:总是头上贴最大数的那个人最先猜出自己头上的数

那一次看到这个题总有一种万千草泥马奔腾的感觉,然后就扔一边去了,今天和同事突然又讨论回这个问题,所以回来顺便整理一下这类问题。

因为现在每个人只知道另外两个人头上的数字,因此他的头上只可能是另外两个数相加或者相减两种情况,如果能排除掉一种情况,那么他就知道了自己头上的数字。

所以,假设第一次问A,A就说我知道了,那一定B和C头上的数是相等的,因为,三个人头上的数是正整数,因此A可以排除掉自己头上的数是B、C头上的数之差的情况,所以他知道自己头上的数是B、C头上的数之和。

所以我们假设A, B, C头上的三个数的最大公约数为1,记为(a, b, c),那么,第一次问A,如果A猜到了,那说明答案就是(2, 1, 1)这种情况,如果A说不知道而B说知道了,那么有两种情况:(1, 2, 1)和(2, 3, 1),前者的原因同上一段,而后者的原因是A已经帮他把b=a-c的情况排除掉了,所以能确定是b=a+c这种情况。

所以以此类推,可以通过递推的手法得到表如下:

表中列举的是第几轮问某个人回答是 我知道了 可以确定的三个数的情况,或者说,第几轮问到某个人回答是 我不知道 可以排除的三个数的情况。

问A问B问C
第一轮(2,1,1)(1,2,1),(2,3,1)(1,1,2),(2,1,3),(1,2,3),(2,3,5)
第二轮(3,2,1),(4,3,1),(3,1,2),(4,1,3),(5,2,3),(8,3,5)(1,3,2),(2,5,3),(1,4,3),(2,7,5),(3,4,1),(4,5,1),(3,5,2),(4,7,3),(5,8,3),(8,13,5)(3,2,5),(4,3,7),(1,3,4),(2,5,7),(1,4,5),(2,7,9),(3,4,7),(4,5,9),(3,5,8),(4,7,11),(5,8,13),(8,13,21),(3,1,4),(4,1,5),(5,2,7),(8,3,11)

可以看出,递推的方法就是从上一次问自己后到这一次问自己前,另外两个人说 不知道 排除的情况,将另外两个数相加的和替换掉自己的数。例如,第二轮问B的情况是由第一轮问C和第二轮问A的所有三元组(a,b,c),将b替换为a+c的和(因为是从b=|a-c|的情况递推过来的)

所以根据这个表,可以试验一下网上流传比较多的,说第二轮问到C说 我知道了,我头上的数是144 这个版本。
因为c=144,所以在第二轮问C的所有三元组中找到第三个数是144的约数的情况,即:(1,3,4),(2,7,9),(4,5,9),(3,5,8),(3,1,4),然后将第三个数扩到144,前面同倍的扩大,得:(36, 108, 144), (32, 112, 144), (64, 80, 144), (54, 90, 144), (108, 36, 144),共5种情况。

回到原来的问题上,如果对于一般的N和M,那同样可以按照这个逻辑往后推,如果要代码实现的话,那就是维护ABC三个数组顺便加个记忆化就可以了。

所以啊,如果和很聪明的人玩游戏才有得玩,如果三个人当中有一个人傻逼了,那这个游戏最后就只能成为一个笑话。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值