给出了0 ≤ k ≤ n ≤ 500000
,0 ≤ 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算法计算剩余乘数? 再次由于需要计算它们的乘积而太久了,因此上面的操作看起来毫无意义。
我走对了吗? 有一些技巧可以解决这个问题吗?
答案 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.
.
.
.