两个二项式系数的GCD模10 ^ 9 + 7

时间:2018-07-30 13:57:09

标签: c++ algorithm math number-theory binomial-coefficients

给出了0 ≤ k ≤ n ≤ 5000000 ≤ l ≤ m ≤ 500000

我需要共同计算GCD(C(n, k), C(m, l))的模数为10 ^ 9 + 7。

我的尝试

我想到了Fourmula的把戏: C(n, k) = n*(n-1)*...*(n-k+1) / k!

例如,假设l> = k: GCD( C(n, k), C(m, l) ) = = GCD( n*(n-1)*...*(n-k+1) / k!, m*(m-1)*...*(m-l+1) / l! ) = = GCD( n*(n-1)*...*(n-k+1)*(k + 1)*...*l/ l!, m*(m-1)*...*(m-l+1) / l! ) = = GCD( n*(n-1)*...*(n-k+1)*(k + 1)*...*l, m*(m-1)*...*(m-l+1) ) / l!

l!的二进制幂转换为10 ^ 9 + 5很好,但是我不知道如何继续。

(k + 1)*...*l部分破坏了一切。如果乘数之间有交点,我会发现一些好处。 n*(n-1)*...*(n-k+1)m*(m-1)*...*(m-l+1), 但如果没有,则整个GCD必须包含在此(k + 1)*...*l部分中。

接下来是什么?使用本机GCD算法计算剩余乘数? 再次由于需要计算它们的乘积而太久了,因此上面的操作看起来毫无意义。

我走对了吗? 有一些技巧可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

有了juvian的建议,这非常简单。我怎么没想到因式分解的想法!

下面的我的C ++代码:

RuntimeWarning: The shape parameter of the erlang distribution has been given a non-integer value 2.1.
RuntimeWarning: The shape parameter of the erlang distribution has been given a non-integer value 1.9.
.
.
.