我认为计算排列总数的方法 modulo m
,其中 m 是任意整数(通常选择为大素数)是使用以下属性:
(a * b) % m = ((a % m) * (b % m)) % m
考虑到 N 的排列总数是N! = 1 * 2 * 3 * .. * N
,如果你需要计算N! % m
,你基本上可以将上面的属性应用于模 m 的乘法,你有:
((((1 * (2 % m)) % m) * (3 % m)) % m) * ..
编辑
为了计算 90!/ (10! ^ 9) 值,您可以简化因子,然后使用乘法模 m 计算最终结果模 m。
这就是我的想法:
90!= 10!* (11 * 12 * .. * 20) * (21 * 22 * .. * 30) * .. * (81 * 82 * .. * 90)
然后,您可以将原始表达式重写为:
(10! * (11 * 12 * .. * 20) * (21 * 22 * .. * 30) * .. * (81 * 82 * .. * 90)) / (10! * 10! * .. . * 10!)
在分子处,您有 9 个因子的乘积 - 将括号中的每个表达式视为一个因子。分母也是如此(您有 9 个因子,每个因子等于 10!)。
分母上的第一个因素很容易简化。之后,您仍然有 8 对需要简化。
因此,您可以考虑产品的每个术语并简化分母。例如:
11 * 12 * 13 * 14 * 15 * 16 * 17 * 18 * 19 * 20 <=> 11 * 2 * 2 * 3 * 13 * 2 * 7 * 3 * 5 * 2 * 2 * 2 * 2 * 17 * 2 * 9 * 2 * 2 * 5
分母总是:2 * 3 * 2 * 2 * 5 * 2 * 3 * 7 * 2 * 2 * 2 * 2 * 3 * 3 * 2 * 5
简化后,第二对减少为:2 * 2 * 11 * 13 * 17 * 19
这同样适用于随后的每一对,您最终会得到一个简单的乘积,可以使用上面的公式以 m 为模计算。
当然,有效地实现算法来执行简化将是棘手的,所以最终必须有一个更好的方法让我现在无法理解。