首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何计算nCr %m

如何计算nCr %m
EN

Stack Overflow用户
提问于 2014-11-17 02:25:49
回答 1查看 102关注 0票数 2

假设mnot prime,如何计算nCr

1 <= n, r <= 100000

例如,如果我们有m质数,我们可以做的是fact(n) * invmod(fact(r)) * invmod(fact(n-r))

where invmod(a) = power(a, m-2)

如果m不是质数,该怎么办?

EN

回答 1

Stack Overflow用户

发布于 2015-02-13 19:05:20

我们知道

代码语言:javascript
复制
C(n,r) = fact(n)/(fact(r)*fact(n-r))

但考虑C(7,5):

代码语言:javascript
复制
C(7,5) = 7x6x5x4x3x2x1 / (5x4x3x2x1 * 2x1)
       = 7x6 / 2x1

所以想象一下,我们不是做所有的产品,而是用一系列的值:

代码语言:javascript
复制
C(7,5) = product( set(1..7) - set(1..5) ) / product(1..2)

但实际上,我们可以定义一个交叉取消函数,它取一个集合中的项目,并在可能的情况下从第二个集合中取消值:

代码语言:javascript
复制
crossCancel(numeratorSet, denominatorSet) -> 
   remainingNumers, remainingDenoms

这应该给我们留下需要计算模m的最小乘积,但我们可以走得更远。如果我们把剩下的每一项都分成它的因子:

代码语言:javascript
复制
  7x6 / 2
= 7x3x2 / 2

进一步减少将取消2

代码语言:javascript
复制
= 7x3

实际上,我们知道nCr每次都会取消公共产品(5x4..1),因此我们可以立即将其缩短为

代码语言:javascript
复制
product(set(r+1..n))/product(set(1..n-r))

还可以证明,分母总是会抵消到分子中(因为如果r和n被例如3分开,那么3将在分母中,并且3个连续的数字将在分子中,所以必须取消),所以我们知道我们总是可以这样做

代码语言:javascript
复制
product(set(factorsOf(r+1 .. n)) - set(1..n-r))

考虑到现在有限的乘积,确定模数m的乘积应该是多少应该是相当简单的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26960470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档