经典题目【鬼谷子问徒】

解了好久结果深入不进去了,只能求助百度,唉,笨蛋一个

一段无厘头的对话,暗含曲折的推理,在哥德巴赫大神的指引下,居然能神奇地得出结论。禁不住想:数字到底是人造的、还是神造的?
---- 进入正题 ----
鬼谷子是孙膑、庞涓的老师,他从2到99中选出两个不同的整数,把两数之和S告诉了庞涓、把两数的乘积M告诉了孙膑。
1、庞涓对孙膑说:虽然我无法确定这两个数是什么,但我肯定你也不知道这两个数是什么。
2、孙说:我本来不知道,但是你这么说,我就知道了。
3、庞说:既然你知道了,那我也就知道了。
问:这两个数字是什么?
(题目到此戛然而止,如果是在考试的话,是不是有种被雷劈中、然后坠入万丈深渊的感觉?)
---- 推理步骤 ---- 其实就是推导三句话的数学含义
  1、庞涓知道两数之和S,就敢说孙膑一定不知道,这意味着:这个和数S不是两个素数(质数)的和,否则孙膑就有可能猜出答案。
例如,庞涓的和S不能是16,否则万一两个数是5+11,孙膑拿着乘积M=55肯定能猜出来。再如,和也不能是15,因为可能是2+13,孙膑拿着26也能猜出来…等等。
因此这句话大大限制了庞涓可能拿到的和数S。原则上可以从2+3一直试到98+99,试出所有可能的和。但不用这么麻烦,哥德巴赫猜过:所有大于4的偶数都可以写成两个素数的和,所以庞涓的和S只能是奇数(一下子少了一半吔)。
(顺便说一句,哥猜还没有被最终证明,但计算机科学家们好像已经通过粗鲁的硬算,验证到10的100次方以内都是成立的。哥大神,你这么会猜,能猜六合彩不?)
但奇数和仍然有很多,怎么能简便写出所有可能的和数{Si}呢?
我家的王可意小朋友说:奇数和必然是一个偶数+一个奇数(聪明,有前途),所以鬼老师必然是选了一奇一偶的两个数。而且,别忘了,这两个数不能同为素数。
不妨来试一下,如果偶数大于等于4,它本身就不是素数,这样对另外一个奇数就没有任何限制了,也就没法缩小可能的和数{Si}的范围。
好在有个特别二的2,它既是偶数,又是素数,庞涓的和数S总是可以拆分为2+一个奇数,这时奇数就必须是非素数,即9、15、21、25、27、33…,而可能的和数{Si}就可以简便地写出来,即11、17、23、27、29、35…
这就是第一句话告诉我们的,庞涓同学的和数S只能是上面这些数当中的一个。
(微言大义啊,抹把汗,继续第二句)
  2、孙膑同学作为兵圣孙子的后代,电光火石之间已经猜到可能的和数{Si},又风驰电掣地将每个和拆分为所有可能的两个数,再得出对应的可能的乘积{Mj}si(即每一个Si都对应一组Mj)。
例如,如果庞涓和是11,可能的积就是2*9=18、3*8=24、4*7=28、5*6=30。如果庞涓和是17,可能的积就是2*15=30、3*14=42、4*13=52、5*12=60、6*11=66、7*10=70、8*9=72……
接下来再跟鬼老师告诉自己的乘积一对比,只有一个能对上,不是它,还能是谁?
(孙膑心想,怎么这么巧,我手上的乘积刚好只出现了一次,而不像30=5*6也=2*15这样出现一次以上。如果我的乘积是30,就猜不出到底是5*6、还是2*15了。嗯,这手气得去买体彩啊!结果孙膑买彩票输惨了,回来给鬼老师哭诉,鬼老师哭笑不得:这那是手气呢?明明是题目给定的条件,不然哪里有解?这个月吃泡菜吧。)
可气的是,各位看官,我们不知道这孙子的孙子的孙子到底拿到的乘积M是多少,而只出现一次的乘积有很多,例如2*9=18、3*8=24、4*7=28、4*13=52、4*19=76……都只出现一次(大家动手试试,可以将庞涓可能的和数{Si}所对应的可能的积{Mj}si都写出来),所以我们还是不知道答案,还得再看庞涓第三句话怎么说。
  3、更气人的,庞涓这会也猜出答案了。他知道他的和数S,他只需将和数S拆分为两个数并得出乘积,如果有且仅有一个乘积是与其它所有{Mj}si都不相同的,就可以判定了。但苍天啊、大地啊,我们既不知道庞涓的和数S,也不知道孙膑的乘积M,这咋办呢?
这时奇迹出现了,冥冥之中,自有定数。若你写出所有可能的和数{Si}所对应的所有可能的乘积{Mj}si,就会发现,只有和数S=17这一组中不重复的乘积是唯一的,即4*13=52,所有其它和数S‘对应的乘积组中,都有多个不重复的乘积,例如和数=11这一组有2*9=18、3*8=24、4*7=28都是唯一的乘积,和数=23这组有4*19=76、7*16=112都是唯一的乘积。如果摊上这些和数的话,庞涓是猜不出来的。所以答案只可能是4和13!

from:https://tieba.baidu.com/p/2942277164

时间: 2024-10-14 04:12:52

经典题目【鬼谷子问徒】的相关文章

学习心得:《十个利用矩阵乘法解决的经典题目》from Matrix67

本文来自:http://www.matrix67.com/blog/archives/tag/poj大牛的博文学习学习 节选如下部分:矩阵乘法的两个重要性质:一,矩阵乘法不满足交换律:二,矩阵乘法满足结合律经典题目1 给定n个点,m个操作,构造O(m+n)的算法输出m个操作后各点的位置.操作有平移.缩放.翻转和旋转    这 里的操作是对所有点同时进行的.其中翻转是以坐标轴为对称轴进行翻转(两种情况),旋转则以原点为中心.如果对每个点分别进行模拟,那么m个操作总共耗时 O(mn).利用矩阵乘法可

十个利用矩阵乘法解决的经典题目

转载自    Matrix67: The Aha Moments 好像目前还没有这方面题目的总结.这几天连续看到四个问这类题目的人,今天在这里简单写一下.这里我们不介绍其它有关矩阵的知识,只介绍矩阵乘法和相关性质.    不要以为数学中的矩阵也是黑色屏幕上不断变化的绿色字符.在数学中,一个矩阵说穿了就是一个二维数组.一个n行m列的矩阵可以乘以一个m行p列的矩阵,得到的结果是一个n行p列的矩阵,其中的第i行第j列位置上的数等于前一个矩阵第i行上的m个数与后一个矩阵第j列上的m个数对应相乘后所有m个

矩阵乘法的经典题目_源自Matrix67_

嘛,都刷一遍好辣. 矩阵Am?n就是一个m行n列的数表. 考虑矩阵的乘法: C=A?B=∑aik?bkj 那么对于矩阵A的要求就是:A为m * n的矩阵 对于矩阵B的要求就是:B为n * p的矩阵 乘得的矩阵C的规模:m * p的矩阵 矩阵乘法是不满足交换律的.但它满足结合律和分配律. 经典题目1 给定n个点,m个操作,构造O(m+n)的算法输出m个操作后各点的位置.操作有平移.缩放.翻转和旋转 然后盗图 考虑实际上这个变换对应着一个类似于线性变换的东西,我们显然是可以用矩阵来搞的. 而对于翻转

矩阵经典题目八:hdu 2175 How many ways??

http://acm.hdu.edu.cn/showproblem.php?pid=2157 给定一个有向图,问从A点恰好走k步(允许重复经过边)到达B点的方案数mod p的值 把给定的图转为邻接矩阵,即A(i,j)=1当且仅当存在一条边i->j.令C=A*A,那么C(i,j)=ΣA(i,k)*A(k,j),实际上就等于从点i到点j恰好经过2条边的路径数(枚举k为中转点).类似地,C*A的第i行第j列就表示从i到j经过3条边的路径数.同理,如果要求经过k步的路径数,我们只需要二分求出A^k即可.

[转]十个利用矩阵乘法解决的经典题目

好像目前还没有这方面题目的总结.这几天连续看到四个问这类题目的人,今天在这里简单写一下.这里我们不介绍其它有关矩阵的知识,只介绍矩阵乘法和相关性质.    不要以为数学中的矩阵也是黑色屏幕上不断变化的绿色字符.在数学中,一个矩阵说穿了就是一个二维数组.一个n行m列的矩阵可以乘以一个m行p列的矩阵,得到的结果是一个n行p列的矩阵,其中的第i行第j列位置上的数等于前一个矩阵第i行上的m个数与后一个矩阵第j列上的m个数对应相乘后所有m个乘积的和.比如,下面的算式表示一个2行2列的矩阵乘以2行3列的矩阵

矩阵经典题目七:Warcraft III 守望者的烦恼(矩阵加速递推)

https://www.vijos.org/p/1067 很容易推出递推式f[n] = f[n-1]+f[n-2]+......+f[n-k]. 构造矩阵的方法:构造一个k*k的矩阵,其中右上角的(k-1)*(k-1)的矩阵是单位矩阵,第k行的每个数分别对应f[n-1],f[n-2],,f[n-k]的系数.然后构造一个k*1的矩阵,它的第i行代表f[i],是经过直接递推得到的.设ans[][]是第一个矩阵的n-k次幂乘上第二个矩阵,f[n]就是ans[k][1]. 注意:用__int64 #in

[leetcode]53Maximum Subarray动态规划经典题目:最大子串问题

/** * Find the contiguous subarray within an array (containing at least one number) * which has the largest sum. For example, given the array [-2,1,-3,4,-1,2,1,-5,4], the contiguous subarray [4,-1,2,1] has the largest sum = 6. click to show more prac

动态规划经典题目:最大连续子序列和

最大连续子序列和问题 给定k个整数的序列{N1,N2,...,Nk },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= k.最大连续子序列是所有连续子序中元素和最大的一个,例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{11,-4,13},最大连续子序列和即为20. 注:为方便起见,如果所有整数均为负数,则最大子序列和为0. 解决这样一个问题是一个很有趣的过程,我们可以尝试着从复杂度比较高的算法

矩阵经典题目四:送给圣诞夜的礼品(使用m个置换实现对序列的转变)

https://vijos.org/p/1049 给出一个序列,含n个数.然后是m个置换,求对初始序列依次进行k次置换,求最后的序列. 先看一个置换,把置换表示成矩阵的形式,然后将m个置换乘起来.那么初始序列首先执行这个置换k/m次,然后顺次执行前k%m个置换,最后乘上初始矩阵. 最后注意矩阵乘法的顺序,A*B != B*A. #include <stdio.h> #include <iostream> #include <map> #include <set&g