在C ++中有效地查找非常大的N的nCr%m

时间:2016-02-09 09:39:25

标签: c++ algorithm modular-arithmetic

我必须找到值nCr%m,其中0 <0。 r&lt; 10 ^ 6和0 < n&lt; 10 ^ 18和m是素数(为方便起见10 ^ 9 + 7)

我已经阅读了各种文章,如果n <10 ^ 6,我们可以在O(1)时间内找到nCr%m,方法是预先计算从1到n的阶乘和乘法逆。

我的问题: -

现在是否有任何解决方案在O(1)时间内找到nCr%m或者比O(r)更好(如果n <10 ^ 18)(上面的技巧失败,因为我们无法存储因子n对于数组而言太大尺寸)。

我的解决方案: -

我找到了

找到了O(r)解决方案

分子 - &gt; n *(n-1)(n-2)...... (n-r)

分母 - →1 * 2 * 3 * 4 * 5 ...... - [R

ANS =分子* multiplicative_inverse(分母)%模

0 个答案:

没有答案