Для
заданного четного натурального числа n вычислить значение функции
f(n) =
Вход. Четное натуральное число n (1
£ n £ 100000).
Выход. Значение функции f(n) с
четырьмя десятичными знаками.
Пример входа |
Пример выхода |
4 |
0.5000 |
РЕШЕНИЕ
математика
Анализ алгоритма
Прологарифмируем
равенство f(n) = :
ln f(n)
= ln(n – 2)! – –
Вычислим правую
часть равенства и возведем е в нее. Получим
f(n).
Логарифм факториала вычислим как сумму логарифмов:
ln n! = ln 1 + ln 2 + ln 3 + … + ln n
Реализация алгоритма
Объявим глобальные массивы.
#define MAX 100001
double lf[MAX], ans[MAX];
Заполняем
массив lf, в котором lf[i] = lni!.
res = lf[1] = 0.0;
for(res = 0, i = 2; i < MAX; i++)
{
res += log((double)i);
lf[i] = res;
}
Заполняем
массив ans, в котором ans[i] = f(i).
for(i = 2; i < MAX; i += 2)
{
res = lf[i/2-1];
res = lf[i-2] - (i -
2) * log(2.0) - res - res; // res = ln f(i)
ans[i] =
exp(res);
}
scanf("%d",&n);
printf("%.4lf\n",ans[n]);
Java реализация
import java.util.*;
import java.io.*;
public class Main
{
public static final int MAX = 100001;
public static void main(String[] args)
{
Scanner
con = new Scanner(System.in);
PrintWriter out = new PrintWriter(System.out,true);
int i, n = con.nextInt();
double lf[] = new double[MAX],
ans[] = new double [MAX];
double res = lf[1] = 0.0;
for(res = 0, i = 2; i < MAX; i++)
{
res += Math.log(i);
lf[i]
= res;
}
for(i = 2; i < MAX; i += 2)
{
res =
lf[i/2-1];
res =
lf[i-2] - (i - 2) * Math.log(2.0) - res - res;
ans[i] = Math.exp(res);
}
out.printf(Locale.US,"%.4f\n",ans[n]);
}
}