一个排列组合问题:
N位二进制数,01组合正好出现两次的个数有多少?
比如,N=5,有 00101, 10101, 01001, 01101, 01010, 01011六种。
这个题目,如果用暴力求解也是可以的,但是当N比较大的时候就很尴尬了。
用数学方法(排列组合),怎么求解这道题呢?
先晒晒我答复的结果:(N+1)! / (N-4)! / 5!
下面是这个公式的求解过程:
我们可以把这个字串分成六个部分,每个部分的各位上数值一样,相临两个部分的数值不同。第一部分为1,最后一部分为0
也就是可以写成以下形式:
1...1 0...0 1...1 0...0 1...1 0...0
(如果再多,就不止两个01组合了。比如最前面多上0,就有三个01;或者最后多上1,也是有三个01)
记这六个部分中每个部分的位数为n1, n2, n3, n4, n5, n6
这里:
n1, n6 >= 0
n2, n3, n4, n5 >= 1
n1 + n2 + n3 + n4 + n5 + n6 = N
到这里,问题就转化成:
把N个球放入六个抽屉,第2、3、4、5这四个抽屉,每个至少一个球。
如果我们从第2、3、4、5这四个抽屉中各取出一个球,问题又转化成:
把 N-4个球放入6个抽屉,有多少种放法?
这是排列组合中的一道经典例题。如果记X=N-4,则组合数有 (X+5)! / X! / 5!
把X=N-4代入上面的公式,得到:(N-4 + 5) ! / (N-4)! / 5!
化简后即可得到上述公式:
(N+1)! / (N-4)! / 5!