Используя генерирующую функцию, я полагаю, что вы можете показать, что сумма может быть оценена точно как n(n_2)*(2^(n-2))
.
Это можно получить, переписав сумму в следующей форме:
Это суммирование можно упростить, признав его просто биномиальным разложением
, который можно дифференцировать дважды по альфа и оценивать при альфа = 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), используя метод повторное возведение в квадрат для вычисления 2 ^ x, уменьшая все умножения по модулю (1e9 + 7) на каждом этапе расчета.