Предисловие. Пусть нам надо посчитать . Можно, кончено, считать в лоб, высчитывая по очереди все факториалы и складывая их. Однако зачем заставлять компьютер перемножать, допустим, первые 50 чисел (высчитывая ), если до этого мы считали , и нам нужно всего лишь домножить это дело на 50? Поэтому логичнее куда-то запоминать значения посчитанного факториала , чтобы потом умножить его на . В результате мы получим цикл вида for(int i=1; i<=n; i++){a=a*i; s=s+a;} Здесь — высчитываемая сумма, — «хранилище» наших факториалов.
Ту же идею попытаемся использовать, высчитывая выражение . Только если в примере выше нам удалось обойтись одним «хранилищем» (там, где мы запоминали факториалы), то здесь их понадобится несколько.
Распишем произведение : . В примере с факториалами нам надо было посчитать сумму штучек вида , а здесь — произведение штучек вида . Идея та же, только сложнее. И, как в примере мы вычисляли факториал числа через , так и здесь попробуем выразить через .
Для этого распишем сумму: . Обозначим это выражение за .
Теперь распишем то, что мы хотим получить, то есть сумму . Если внимательно посмотреть, то первые слагаемых у этих двух сумм практически одинаковы, отличается лишь степень при : в она на единичку больше. Кроме того, в имеется лишнее слагаемое . Получается, что . Обозначим за .
Вот тут появляется отличие от примера с факториалами. Там мы обходились одним «хранилищем» посчитанных ранее значений, с помощью содержимого которого получали новое слагаемое. Алгоритм был таков: взять число из «хранилища», слегка его изменить (домножить на — получить актуальный факториал), прибавить результат к сумме. В этом же примере таких хранилищ необходимо два — в одном будет храниться число , в другом — . Удлиняется и алгоритм: мы возьмём число , изменим его, чтобы получить , затем возьмём , с помощью посчитанного уже превратим в , и затем умножим произведение, которое мы высчитываем, на . Каким образом превращать в , мы уже знаем: . Осталось выяснить, как превращать в .
Имеем:
. Но можно заметить, что первый множитель является , поэтому .
Вот мы и установили, как выражается через . Теперь мы можем задать значения и , после чего по имеющимся формулам и найти и — так мы найдём первый множитель. По тем же самым формулам, но уже используя и , мы находим и — второй множитель. Действуя так далее до , мы находим все множители, входящие в состав произведения, которое нам необходимо посчитать.
Ну а цикл вообще должен иметь следующий вид:
for (int i=1;i<=n;i++)
{
s=s*x*(n-i+1)/(i*i);
r=r*x+s;
p=p*r;
}