这是一个比编程更多的数学问题,但我认为这里的很多人都非常擅长数学! :)
我的问题是:假设一个9 x 9网格(81个单元格)必须包含数字1到9,每个正好9次,可以生成多少个不同的网格。数字的顺序无关紧要,例如第一行可以包含9个1等。这与数独有关,我们知道有效数独网格的数量是6.67×10 ^ 21,所以因为我的问题没有受到限制像Sudoku一样,每行,每列都有9个数字,然后答案应该大于6.67×10 ^ 21。
我的第一个念头是答案是81!然而,在进一步反思时,这假设每个细胞可能的81个数字是不同的,不同的数字。它们不是,每个单元格有81个可能的数字,但只有9个可能不同的数字。
我的下一个想法是,第一行中的每个单元格可以是介于1和9之间的任何数字。如果偶然第一行恰好是全部相同的数字,比如全1,那么第二行中的每个单元格行只能有8个可能性,2-9。如果这一直持续到最后一行,则可以通过9 ^ 2 * 8 ^ 2 * 7 ^ 2 ..... * 1 ^ 2来计算不同排列的数量。但是,如果每行不包含相同数字的9,则不起作用。
我学习这些东西已经有一段时间了,我想不出办法解决问题,我很感激任何人都可以提供帮助。
答案 0 :(得分:9)
想象一下,取出81张空白纸条,每张纸上写一个1到9的数字(每个数字中有9个)。将牌组洗牌,然后开始将牌照放在9x9网格上。
你可以创造81!如果你认为每个单据都是独一无二的,那就是不同的模式。
但你想要考虑所有的1是等价的。
对于任何特定配置,将重复该配置的次数 由于1的全部相同?答案是9 !,你可以通过写入1来换写九张单的方式。
这样可以将排列总数减少到81!/ 9!。 (你除以无法区分的排列数。而不是9个!无法区分的排列,想象只有2个无法区分的排列。你可以将计数除以2,对吗?所以规则是,你除以无法区分的排列数。)
啊,但你也希望2's等同,3's等等。 通过相同的推理,减少了排列的次数
81!/(9!)^9
按Stirling's approximation,大约是5.8 * 10 ^ 70。
答案 1 :(得分:4)
首先,让我们从81个数字开始,1到81.其排列数为81P81
或81!
。很简单。
但是,我们有九个1
s,可以9!
无法区分的排列排列。与2
,3
等相同。
所以我们所拥有的是董事会排列的总数除以所有数字的所有无法区分的排列,或81! / (9! ** 9)
。
>>> reduce(operator.mul, range(1,82))/(reduce(operator.mul, range(1, 10))**9)
53130688706387569792052442448845648519471103327391407016237760000000000L