在时间限制1秒内找到答案mod 1e9 + 7。 C(n,i)等于从n个不同项目中选择i项目的方式的数量(忽略顺序)。
答案 0 :(得分:2)
使用生成函数,我相信您可以证明总和可以精确地评估为n(n_2)*(2^(n-2))
。
这可以通过以下形式重写总和来得出:
通过将其识别为
的二项式扩展,可以简化求和可以相对于α进行两次微分,并在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
计算所需的结果模数(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算法,您可以得到一些帮助。