当阶乘在 n 的范围内时,您如何有效地计算阶乘?

How do you calculate factorials efficiently when they will be within a range of n?

任务: 给定两个长度为 n 的对称数组 a,b,[1, ..., n] 的排列,计算数组 c = [ a[0]!/b[0]! , ... , a[n-1]!/b[n-1]! ] 在 O(n) 时间内。 (所以在给定索引处划分 a 和 b 中值的阶乘。)

我好像想不出解决办法。在我看来可能最接近解决方案的想法可能是按照距 a[i] 和 b[i] 的距离从高到低对数组进行排序。然后保存第一个a[0]!/b[0]!的结果当你前进到较低的差异时,只需要减少一点点。但这并没有说明 (a[i],b[i]) 和 (a[j],b[j]) 的间隔可能只是不重叠。

现在我不确定这是否只是给定要求中的一个错误,尽管给出的要求是无限的space。

您可以创建第四个数组,使得 d[i] <- i * d[i-1] 通过 Theta(n)(注意 d[1] <- 1)。现在,通过 ab 并计算 c,如下所示:

for i <- 1 to n
    c[i] <-  d[a[i]]/d[b[i]]

在上面,数组是基于一个的索引。