LCM用于组合

时间:2015-10-07 13:20:28

标签: algorithm math combinatorics lcm

两个整数 n k ,两者都在 100000 范围内。

我们如何计算 n * n-1 C 0 的LCM(n的乘法和(n-1选择0) ), n * n-1 C 1 (n的乘法和(n-1选1)), n * < sup> n-1 C 2 (n和(n-1选择2)的乘法),.........., n * n-1 C k (n和(n-1选择k)的乘法)以模 1000000007 。< / p>

我只是找到所有值,然后计算模数,当数字增长时,模数会产生很多问题。

如何有效地计算它?

1 个答案:

答案 0 :(得分:3)

一些想法:

  1. 很容易看出lcm(nx,ny)= n * lcm(x,y) 所以实际上问题减少到计算C系数的lcm。

  2. 同样很容易看出lcm(x / a,x / b)= x / gcd(a,b),其中gcd是最大公约数。

  3. 如果你还记得n选择k = n!/ k!(n-k)!这两个步骤减少了计算

    的问题

    gcd(0!n!,1!(n-1)!,2!(n-2)!,...,k!(n-k)!)

    然后划分n * n!通过这个值。

    gcd可以通过Euclidean algorithm轻松计算出来。实际上更容易实现:

    gcd(i!(n-i)!,(i + 1)!(n-i-1)!)= i!(n-i-1)!gcd(n-i,i + 1)

    (对于最后一个gcd,你仍然需要使用欧几里德算法。但现在它更容易了。)

    1. 你实际上可以在一个模数为1000000007的环中进行所有计算。这意味着你可以在每次乘法/加法后取剩余的1000000007,它不会影响答案。

    2. 最后,您有两个值:

    3. x = n * n! mod 1000000007

      y = gcd(0!n!,1!(n-1)!,2!(n-2)!,...,k!(n-k)!)mod 1000000007

      您可以将x乘以z,而不是将这些数字除以

      z * y = 1 modulo 1000000007

      您可以在this article中详细了解其原因以及如何查找此类here

      1. 你必须使用64位整数,因为即使两个1000000007-mod数字的乘积也不适合32位。或者,您可以编写自己的mod乘法算法,该算法不会溢出32位值(如果您知道如何编写乘法算法并在每个步骤后按计算1000000007余数采纳我的建议,则很容易做到)