这个问题可以变形成如下的或许更简单的问题。
求 $n_1$ 个 $A$, $n_2$ 个 $B$, $n_3$ 个 $C$ 的所有使$A,B,C$ 不与自己相邻的排列的个数 ...
业余的业余 发表于 2019-2-12 21:06
是的,先不必考虑同类节目的顺序,最后再乘回 n1!n2!n3! 就是了。
这样连楼主的代码也可以简化不少,比如:- {n1, n2, n3} = {3, 2, 1};
- lstall = Join[ConstantArray[a, n1], ConstantArray[b, n2], ConstantArray[c, n3]];
- DeleteCases[Permutations[lstall], {___, a, a, ___} | {___, b, b, ___} | {___, c, c, ___}]
- % // Length
- %*n1!*n2!*n3!
复制代码 不过也没啥用,因为用全排列列出来再删除太bao力了,别说很大的数,我就试下 {n1, n2, n3} = {6, 6, 6} 都卡死。
至于数学的解法,楼上的就很 nice,相应的编程应该也不难吧。
我暂时还没什么更好的想法…… |