Jul 20

    假设我们俩各自独立地随机选取一个有无穷多个顶点的图(两点之间1/2的概率有边1/2的概率没有边)。那么,我们俩选到相同的图的概率是多少?

    令人难以置信、但想通了之后又异常显然的是,两个图相同的概率为1。并且,我可以精确地告诉你,这个相同的图是什么样子的。考虑这样一个无穷大的图,我们用自然数1, 2, 3, ...给所有顶点标号,然后如果y的二进制表达中的右起第x位为1,就在顶点x和顶点y之间连一条线。比如,顶点5就和顶点1、顶点3相连。我可以证明,我们俩都100%地会选取到上述这个图。

查看更多 »

Apr 9

    2009年2月份IBM Ponder This的谜题可能是从98年谜题月赛开办以来最难的谜题。谜题发布一个月之后仍然没有任何人答对,主办人不得不宣布延迟一个月,并再三增加提示。最终,答对此题的仍然只有7个人。很久没有看到如此精彩的谜题了,有兴趣的网友不妨试一试。
    题目非常有趣。传统的谜题是给出谜面求解谜底,但这个谜题则恰恰相反:下面这一串数字是某个问题的答案,你能猜出这个问题是什么吗?这串数字里有一个错误在哪里?

900F 80F0 8F00 80CA BE12 AA90 9400 0048 3E5B 8AC0
3400 00CB BC81 8A08 3C00 0050 BE43 00C0 3E00 A019
8059 BE13 2000 0092 BE9B 2A0B 2A00 8052 8841 04C0
3E00 840B 084B 0098 E000 8819 845A 8012 0300 0050
826F 0500 0600 846E 8264 0900 0A00 8065 0C00 0072
A054 8368 8569 4800 4400 8573 4200 4100 8349 8542
2800 2400 854D 2200 2100 9F00 E000 8888 8444 8000
0030 0DED 8222 0050 0060 8444 8222 0090 00A0 8000
00C0 0DED A000 8333 8555 4080 4040 8555 4020 4010
8333 8555 2080 2040 8555 2020 2010 8300 8500 8030
8050 0880 0840 8050 0820 0810 8030 8050 0480 0440
8050 0420 0410 8500 8030 8050 0280 0240 8050 0220
0210 8030 8050 0180 0140 8050 0120 0110 90F0 9F00
E000 8888 8444 8000 0003 0DED 8222 0005 0006 8444
8222 0009 000A 8000 000C 0DED A000 8333 8555 4008
4004 8555 4002 4001 8333 8555 2008 2004 8555 2002
2001 8300 8500 8003 8005 0808 0804 8005 0802 0801
8003 8005 0408 0404 8005 0402 0401 8500 8003 8005
0208 0204 8005 0202 0201 8003 8005 0108 0104 8005
0102 0101 9F00 8030 8050 8003 8005 0088 0084 8005
0082 0081 8003 8005 0048 0044 8005 0042 0041 8050
8003 8005 0028 0024 8005 0022 0021 8003 8005 0018
0014 8005 0012 0011 80FF 8F0F A333 8000 5000 0DED
8000 3000 0DED A333 C555 1800 1400 C555 1200 1100
8F0F A333 A555 1080 1040 A555 1020 1010 A333 A555
1008 1004 A555 1002 1001

查看更多 »

Mar 20

摘录几道题目。

计算1·2^2 + 2·3^2 + 3·4^2 + ... + 19·20^2
原式 = (1^3 + 2^3 + ... + 20^3) - (1^2 + 2^2 + ... + 20^2) = 44100 - 2870 = 41230

求2^x = 3^y - 1的所有正整数解
x=1时(1,1)是一个解;当x>1时,方程模4后左边永远等于0,右边则是(-1)^y - 1,可知y为偶数。令y=2z,那么有2^x = (3^z - 1)(3^z + 1),这就要求3^z-1和3^z+1都是2的幂;但它们只相差2,因此它们只有可能是2和4,于是z=1,即原方程的另一个解为(3,2)。

圆周上有2008个点。选择两个点连成一条线,再选另外两点连一条线,这两条线段相交的概率为多少?
给定四个点,在三种连接方案中恰有一种会发生相交。取遍所有C(2008,4)种组合,相交的总情况数总是占了1/3,因此所求的概率就是1/3。

查看更多 »

Feb 17

http://woodgears.ca/marbleadd/

Feb 2

    如果说数学家是魔术师的话,无穷就是一根最强大的魔杖。在Manfred Schröder的一篇题为Fractals in Music的论文里,作者提到,把每个正整数对应的二进制数中“1”的个数依次写下来,得到的数列有一个很神奇的性质:划掉所有的奇数项,得到的序列仍然是整个序列本身。

十进制数  1   2   3    4    5    6    7     8     9    10    11    12    13    14
二进制数  1  10  11   100  101  110  111  1000  1001  1010  1011  1100  1101  1110
1的个数   1   1   2    1    2    2    3     1     2     2     3     2     3     3
取偶数项      1        1         2          1           2           2           3

    最初我是在《算法艺术与信息学竞赛》里见到这个东西的,当时硬是被震撼住了。这样的序列叫做“自相似序列”,意思是说自己的一部分等于本身。注意到,这个“自相似”可以无限制地进行下去。再次取出所得的序列中的偶数项,结果还是与最初的序列一样;再这样做下去做无数次,每一次的结果都会与原始序列相同。也就是说,无穷里面包含了无穷多个规模不同的无穷,并且所有这些无穷都和原来完全相同。不过呢,仔细一想你会发现这个一点也不奇怪,奥妙就在于,n和2n的二进制表达中唯一的差别就是末尾的那个“0”。

查看更多 »

Sep 3

    给定一个集合S和数n,从集合S中取出两个不同的数a,b满足a+b=n的总方案数叫做“集合S中关于n的互补数对个数”。是否有可能把全体非负整数划分为A、B两个集合,使得对于任意一个n,集合A和集合B中关于n的互补数对的个数都相同?

 
查看更多 »

May 12

1. 给你n个数,其中有且仅有一个数出现了奇数次,其余的数都出现了偶数次。用线性时间常数空间找出出现了奇数次的那一个数。
2. 给你n个数,其中有且仅有两个数出现了奇数次,其余的数都出现了偶数次。用线性时间常数空间找出出现了奇数次的那两个数。

 
 

1. 从头到尾异或一遍,最后得到的那个数就是出现了奇数次的数。这是因为异或有一个神奇的性质:两次异或同一个数,结果不变。再考虑到异或运算满足交换律,先异或和后异或都是一样的,因此这个算法显然正确。

2. 从头到尾异或一遍,你就得到了需要求的两个数异或后的值。这两个数显然不相等,异或出来的结果不为0。我们可以据此找出两个数的二进制表达中不同的一位,然后把所有这n个数分成两类,在那一位上是0的分成一类,在那一位上是1的分到另一类。对每一类分别使用前一个问题的算法。

题目来源:http://groups.google.com/group/pongba/browse_frm/thread/f4a080edbe3ce0e1

查看更多 »

Feb 28

    三个人坐成一个圆圈,每个人头上戴着一顶黑色的或者白色的帽子。每个人都只能看到另外两个人头上的帽子颜色。现在,他们需要独立地猜测自己头上的帽子颜色。每个人都需要在自己的小纸条上写下“黑色”、“白色”或者“放弃”。如果说至少一个人猜对,并且没有人猜错,那他们就获胜了;只要有任何一个人猜错,或者所有人都写的“放弃”,那么他们就输了。如果在游戏开始前他们能够商量一个策略,那么最好的策略是什么?
    仔细想一下你会发现,要想保证他们百分之百地获胜是不可能的,因为游戏中大家不能交流信息,谁也不能保证自己能猜对。但是,有一种策略能保证他们有75%的几率获胜。事实上,当人数n=2^k-1时,我们有一种方法可以让获胜的概率达到(2^k-1)/(2^k)。你能想到这种策略吗?


    设身处地地想,你会想到一个很自然的策略:如果一个人看到另外两个人的帽子颜色一黑一白,那这个人就放弃(换了你你也不敢猜);如果另外两个人的帽子颜色一样,那你就猜相反的颜色(概率上看也要大些)。我们来看一下在哪些情况下使用这样的策略能够获胜:

3个黑帽子:每个人都看到两个黑帽子,每个人都猜自己是白帽子,所有人都猜错;
2个黑帽子,1个白帽子:戴黑帽子的人看到一黑一白,于是放弃;戴白帽子的人看的是两个黑帽子,因此他将猜对,从而所有人都获胜;
2个白帽子,1个黑帽子:和上面这种情况是类似的,所有人都将获胜;
3个白帽子:和第一种情况是类似的,所有人都猜错。

    注意到只有在第一种情况和第四种情况下才会输掉游戏,这两种情况占了所有情况的2/8。于是,使用这种策略有75%的概率获胜。

    我们需要想一想,在这个看似几乎不可能获胜的游戏中,为什么这种策略会有如此高的获胜概率。最关键的就是,这种策略充分利用了胜负判断的准则:大家要错就一起错,只有一个人错怪划不来的;要获胜就只让一个人猜对,多几个人同时猜对也没用。

    根据上面的讨论,我们开始尝试把游戏的人数推广到一般的n。为了叙述方便,我们把每个人头顶上的帽子颜色依次用0和1来表示,数字1表示黑帽子,数字0表示白帽子。于是所有可能的情况就是2^n个01串。游戏开始前n个人预先约定一些“保留串”。他们的策略就是,观察其余n-1个人的帽子颜色:如果和所有的保留串都不匹配里,则放弃;如果恰好符合某个保留串,就猜自己是相反的颜色。比如,当n=3时,他们可以约定两个保留串000和111。如果实际情况是001的话,前两个人看到的是?01和0?1,不属于任何一个保留串,于是放弃;第三个人看到的是00?,正好和000相符,于是他就反过来猜自己不是那个0。注意到一些有趣的事实:如果实际情况恰好就是这些保留串之一,那大家就全猜错了;如果实际情况与所有保留串都相差两个数字以上,那大家全部放弃;如果实际情况与某个保留串恰好差一个数字,那只有一个人猜对,其余人放弃,从而获得胜利。现在的问题就是,如何寻找一个保留串集合,使得和某个保留串只差一个数字的情况尽可能的多。注意,我们必须要保证,任意两个保留串之间不能只差一个数字,这样的话才能保证发现有相符保留串的人不会面临“两可”的情况。假如你找到了t个保留串,则保证获胜的情况最多有t*n个(每个串“变一位”都有n种方法)。显然,最完美的情况就是t+t*n恰好等于总的情况数2^n。当n=2^k-1时,t+t*n是有可能恰好等于总情况数2^n的,也就是说每种可能的情况要么就是一个保留串,要么与唯一的一个保留串恰好差一位。此时,t+t*n=t(n+1)=t*(2^k)=2^(2^k-1),t应该等于2^(2^k-1-k)。下面我们说明这t个保留串是如何生成的。
    每个保留串都由原码和校验码两部分组成。我们把n位01串的位置编号转化为二进制,二进制里只有一个数字1的位置(即左起第1,2,4,8,...位)叫做校验码,有至少两个1的位置(3,5,6,7,9,...等其余位置)上的数字称作原码。显然,原码应该有n-k位(即2^k-1-k位)。枚举2^(n-k)种原码的01组合,对于每一组原码,定义第i个校验码的值为,除了它本身以外,所有编号的二进制表达中右起第i个数字为“1”的位置上一共有奇数个1还是偶数个1(相当于把标“x”的位置上的数异或一遍)。比如,第2个校验码是1,当且仅当有奇数个位置上的原码满足,位置编号的二进制表达形如...???1?且该位置上的数值正好也是1。所有可能的原码加上它对应校验码就是我们的保留串。

  01串:     a1  a2  a3  a4  a5  a6  a7
十进制编号:  1   2   3   4   5   6   7

二进制编号: 001 010 011 100 101 110 111
校验码1(a1):         x       x       x
校验码2(a2):         x           x   x
校验码3(a4):                 x   x   x
保留串0:     0   0   0   0   0   0   0
保留串1:     1   1   0   1   0   0   1
保留串2:     0   1   0   1   0   1   0
保留串3:     1   0   0   0   0   1   1
保留串4:     1   0   0   1   1   0   0
   ......      ......     ......        
保留串14:    0   0   1   0   1   1   0
保留串15:    1   1   1   1   1   1   1


    我们可以说明,对于任一个n位01串,只要它不是我们的保留串,我都有办法只变动一个数字让原码和校验码相符(从而变成一个保留串)。我们可以观察一下,由原码算出来的校验码和实际的校验码有哪些不同。如果只有一位校验码不同,直接把它改过来就是了;如果有多位校验码不同,那就找出改动哪一位原码可以让这些校验码同时取反。从位置编号的二进制的角度来考虑,这样的一位原码显然是唯一存在的。同时,我们可以保证任两个保留串之间都相差至少两个数字,即便你的原码只改动一位,校验码必然也会随之变化。前面已经说过,保留串的个数有2^(2^k-1-k)个,只有这2^(2^k-1-k)种情况下才会输掉游戏。因此,我们最初的问题就解决了:当人数n=2^k-1时,获胜的概率达到1 - [2^(2^k-1-k)/2^(2^k-1)],即(2^k-1)/(2^k)。
    顺便说一句,上面的编码方式叫做Hamming编码,是一种数据传输的校验方式。

参考资料:http://cornellmath.wordpress.com/2007/09/20/hat-guessing-puzzles-the-revenge/ (会意字,从啬从土)

« 更早的日志