algorithm - 在最佳时间计算一个数的阶乘

标签 algorithm factorial

我有 N 个数字,我想计算阶乘模数 m 的总和

例如

4 100
12 18 2 11

Ans = (12! + 18! +2!+11!)%100

1<N<10^5和数字来自 1<Ni<10^17 如何在有效时间内计算它。 由于递归方法会失败,即

int fact(int n){
  if(n==1) return 1;
 return n*fact(n-1)%m;
}

最佳答案

如果您预先计算阶乘,使用每个操作 %m,并且将使用关于大于 m 的数字的阶乘评论中的提示,您将得到类似这样的结果

fact = new int[m];
f = fact[0] = 1;
for(int i = 1; i < m; i++)
{
    f = (f * i) % m;
    fact[i] = f;
}

sum = 0
for each (n in numbers)
{
    if (n < m)
    {
        sum = (sum + fact[n]) % m
    }
}

我不确定它是否最好,但它应该会在合理的时间内发挥作用。

Upd:可以使用以下知识优化代码:如果对于某个数字 j,(j!)%m ==0 比对于每个 n > j (n!)%m ==0 ,所以在某些情况下(通常是m 不是质数)没有必要为所有小于 m 的数预先计算阶乘

关于algorithm - 在最佳时间计算一个数的阶乘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28366224/

相关文章:

algorithm - 用于单词列表排列的大 O 表示法

c++ - 在我的 friend 圈中找到最受欢迎的点赞

sql - 在 SQL 中,如何生成 5!56 的每个可能的唯一组合?

c - 阶乘作为连续数的总和

c - 我的 C 程序中的阶乘计算不正确?

function - 如何在 Scala 中优化这个短阶乘函数? (创建 50000 个 BigInt)

algorithm - 了解最长公共(public)子序列算法的时间复杂度

java - 将营业时间添加到 Java DateTime

algorithm - 如何有效地确定 3D 空间中多边形的法线?

loops - 在 Kotlin 中使用 `for` 循环的因子