Algorithm 计算i^2*C(n,i)之和,0<;=我<;=n、 1<;=n<;=10^18

Algorithm 计算i^2*C(n,i)之和,0<;=我<;=n、 1<;=n<;=10^18,algorithm,combinations,Algorithm,Combinations,在1秒的时间限制内找到mod 1e9+7的答案。 C(n,i)等于从n个不同项目中选择i个项目的方法的数量(忽略顺序)。使用生成函数,我相信您可以证明该总和可以精确地计算为n(n_2)*(2^(n-2)) 这可以通过以下形式重写求和得出: 这种求和可以通过将其识别为函数的二项式展开来简化 它可以根据alpha区分两次,并在alpha=0时计算,给出 我们可以用一个简单的Python脚本检查此公式是否给出了正确的结果: import numpy, scipy.misc def fn(n):

在1秒的时间限制内找到mod 1e9+7的答案。
C(n,i)等于从n个不同项目中选择i个项目的方法的数量(忽略顺序)。

使用生成函数,我相信您可以证明该总和可以精确地计算为
n(n_2)*(2^(n-2))

这可以通过以下形式重写求和得出:

这种求和可以通过将其识别为函数的二项式展开来简化

它可以根据alpha区分两次,并在alpha=0时计算,给出

我们可以用一个简单的Python脚本检查此公式是否给出了正确的结果:

import numpy, scipy.misc

def fn(n):
    i = numpy.arange(0, n+1)
    combs = scipy.misc.comb(n, i)
    return numpy.sum((i**2) * combs)

def fn2(n):
    return n*(n+1) * (2 ** (n-2))


for n in range(1, 20):
    print('n={}, raw-sum={}, ratio={}' \
            .format(n, fn(n), (fn2(n) / fn(n))))
将生成以下输出:

n=1, raw-sum=1.0, ratio=1.0
n=2, raw-sum=6.0, ratio=1.0
n=3, raw-sum=24.0, ratio=1.0
n=4, raw-sum=80.0, ratio=1.0
n=5, raw-sum=240.0, ratio=1.0
n=6, raw-sum=672.0, ratio=1.0
n=7, raw-sum=1792.0, ratio=1.0
n=8, raw-sum=4608.0, ratio=1.0
n=9, raw-sum=11520.0, ratio=1.0
n=10, raw-sum=28160.0, ratio=1.0
n=11, raw-sum=67584.0, ratio=1.0
n=12, raw-sum=159744.0, ratio=1.0
n=13, raw-sum=372736.0, ratio=1.0
n=14, raw-sum=860160.0, ratio=1.0
n=15, raw-sum=1966080.0, ratio=1.0
n=16, raw-sum=4456448.0, ratio=1.0
n=17, raw-sum=10027008.0, ratio=1.0
n=18, raw-sum=22413312.0, ratio=1.0
n=19, raw-sum=49807360.0, ratio=1.0

然后,利用计算2^x的技术,在计算的每一步减少所有乘法模(1e9+7),计算期望结果模(1e9+7)应该是一件简单的事情。

Lucas可以解决这个问题,我认为主要代码是Lucas,你可以在网站上了解Lucas,获得代码很容易,之后,你可以作为一个简单的问题来解决它

例如:

LL Lucas(LL a, LL b)
{
    if(a < mod && b < mod)
        return C(a, b);
    return
        C(a % mod, b % mod) * Lucas(a / mod, b / mod);
}
lllucas(lla,llb)
{
if(a
这是一个关于卢卡斯的博客:

如果你有任何其他问题,你可以在这个标题下回答


我建议学习lucas算法,你会得到一些东西。

你试过什么吗?我想了好几个小时,仍然不知道如何解决它。我知道n太大,无法使用暴力,我尝试推断公式,但失败。如果这是Project Euler问题,要求解决是非法的。对不起,我在本地竞赛中遇到了这个问题,我对Project Euler一无所知。你确定要以10000000007(即1e10+7)为模的结果吗?在这类计算中使用(1e9+7)是很流行的,因为后者是质数。非常感谢。您的分析优雅而清晰。我似乎理解了一点,我知道用这个公式,这个问题可以用O(logn)来解决。然而,我的数学很差,我不知道生成函数是如何工作的。我应该学更多的数学。再次感谢你。