Lexicographic permutations
原题目如下:
A permutation is an ordered arrangement of objects. For example, 3124 is one possible permutation of the digits 1, 2, 3 and 4. If all of the permutations are listed numerically or alphabetically, we call it lexicographic order. The lexicographic permutations of 0, 1 and 2 are:
012 021 102 120 201 210
What is the millionth lexicographic permutation of the digits 0, 1, 2, 3, 4, 5, 6, 7, 8 and 9?
大概意思也就是给出 0 1 2 三个数进行排序,可以得到的按大小顺序组合是012 021 102 120 201 210
现在给出0 1 2 3 4 5 6 7 8 9 这10个数,找出按顺序排列的第100万个数。
思路如下:
其实这个不难看出,就是一个排列的问题,
分两步考虑,第一步,我们首先看共有多少种组合,把这10个数按顺序放进10个格子里面,第一个格子可以放任意一个数,有10种方法,第二个格子就只剩9个数可以选了,依次排完,我们知道,可以得到的排列组合共有10*9*8*7*6*5*4*3*2*1 即10的阶乘(以下简称10!)个排序方法,
1000000 = 9!*2 + 8!*6 + 7!*6 + 6!*2 + 5!*5 + 4!*1 + 3!*2 + 2!*2
那按你这么说,这个数岂不是就是26625122……完全不对好不好,不要忽悠广大群众,小心被打出去拖死,拖出去枪毙5分钟……(内心戏,哈哈)
不要以为这样就完事了,其实还没有完,不要着急~~
第三步登场~~~分析:
上面的第一个数确实是2,已经分析过了,来看第二个数,他其实不应该是6,为什么呢?细想一下,6*8!个组合应该是代表的第二位是0 1 2 3 4 5六个数排序(后面八位完全不用理会,随便你排,反正就是那么多个),但是2这个数我们已经排在第一位了呀,你还用?,所以就只能是第二位是0 1 3 4 5 6 个数的组合啦,所以按最小来算,第2位就是7了,是不是?依次类推,第三位6*7!,应该是(第三位0 1 3 4 5 6已被排列过,7刚刚被第2位用了,只能选8罗)……
So , 最后结果……
自己再推一推吧(还是秉持欧拉工程的思想吧,我们寻求的不是一个结果,而是推理验算的过程~~),你说呢?
附上代码(代码也只是算出了上面那个式子):
def factorial(n):
sums = 1
for x in xrange(1,n+1):
sums = sums*x
return sums
sums = 1000000
strs = ''
n = 9
while (sums != 0):
z = factorial(n)
strs = strs + str(n)+'!*' + str(sums/z) + '+'
sums = sums%z
n = n-1
print strs
得到1000000 = 9!*2 + 8!*6 + 7!*6 + 6!*2 + 5!*5 + 4!*1 + 3!*2 + 2!*2