计算i ^ 2 * C(n,i),0< = i< = n,1< = n< = 10 ^ 18的和

时间:2018-05-06 10:37:38

标签: algorithm combinations acm

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

2 个答案:

答案 0 :(得分:2)

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

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

enter image description here

通过将其识别为

的二项式扩展,可以简化求和

enter image description here

可以相对于α进行两次微分,并在alpha = 0时进行评估,得出

enter image description here

我们可以使用简单的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

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

答案 1 :(得分:0)

卢卡斯可以解决这个问题,我认为主要的代码是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);
}

以下是有关lucas的博客:https://blog.csdn.net/acdreamers/article/details/8037918

如果还有其他问题,可以在此下答复。

我建议学习lucas算法,您可以得到一些帮助。