【发布时间】:2012-02-02 05:36:05
【问题描述】:
我必须为重复对象的排列评估以下公式
n!/(r1! * r2! * r3! * ......... * rn!)
wheren <= 500 和1 <= ri <= 10 (总共有n个对象,其中r1与第一种相似,r2与第二种相似,以此类推,公式表示这些对象的排列数)。
为此,我需要一个高效的编码解决方案,因为在 Java 中处理大整数并不能证明对于大型案例有成效。
提前致谢。
【问题讨论】:
-
我天真地编码了它,通过使用 BigIntegers 和除法的正常乘法评估阶乘,但程序挂在边界情况上,这就是我需要它的原因:( :(
-
嗯,减少这一比例的机会很多。
-
我会尝试 C 库 gmp (gmplib.org)。
-
我被要求扩展我关于如何减少分数的建议,所以这里。由于
n <= 500,很有可能构建一个大小为n的数组。使用 Eratosthenes 的筛子查找并存储直到n的所有非质数的因子对。制作另一个大小为n的表,它代表每个因子的指数。现在,迭代每个阶乘。使用筛表将每个因子分解为素因子,将分子中的阶乘的指数表递增,分母中的每个阶乘递减。没有条目最终会是负面的。 -
现在,使用
BigInteger-type 类将未取消的因子相乘。任何时候都不需要除法运算。也没有任何分数。
标签: java c++ c combinatorics