231. 二项式系数质因数分解(The prime factorisation of binomial coefficients)

二项式系数\(C_{10}^3=120\),其质因数分解为\(120=2^3\times3\times5=2\times2\times2\times3\times5\),则有:

$$ 2+2+2+3+5=14 $$
因此\(C_{10}^3\)的质因数分解后各项的和为\(14\),求\(C_{20000000}^{15000000}\)质因数分解后各项的和。

为了找到组合数 \(\binom{20,000,000}{15,000,000}\) 的质因数分解中各项的和,我们可以使用勒让德(Legendre)公式。公式说明:在 \(n!\) 的质因数分解中,质数 \(p\) 的指数为:

$$ \mathrm{v_p}(n!) = \sum_{k=1}^{\infty} \left\lfloor \frac{n}{p^k} \right\rfloor $$

组合数定义如下:

$$ \binom{n}{k} = \frac{n!}{k!(n-k)!} $$

因此,质数 \(p\) 在组合数 \(\binom{n}{k}\) 的质因数分解中的指数为:

$$ \mathrm{v_p}\left(\binom{n}{k}\right) = \mathrm{v_p}(n!) - \mathrm{v_p}(k!) - \mathrm{v_p}((n-k)!) $$

我们可以使用这个公式计算 \(\binom{20,000,000}{15,000,000}\) 的质因数分解中各项的和,代码如下:

# time cost = 29.6s

from sympy import primerange

def legendre(n, p):
    exponent = 0
    while n > 0:
        n //= p
        exponent += n
    return exponent

def main(n=2000_0000, k=1500_0000):
    total_sum = 0

    for p in primerange(1,n):
        exponent = legendre(n, p) - legendre(k, p) - legendre(n - k, p)
        total_sum += exponent * p

    return total_sum

这段代码将计算组合数 \(\binom{20,000,000}{15,000,000}\) 的质因数分解中各项的和。时间复杂度主要取决于质数的生成和勒让德计算。埃拉托斯特尼筛选法的时间复杂度为 \(O(n \log \log n)\),勒让德计算的复杂度为 \(O(n \log n)\)。空间复杂度为质数列表的 \(O(n)\)