k-мультифакториалом
числа n называется произведение всех положительных чисел вида n –
k * x, x = 0, 1, 2, …
и обозначается fack(n).
Приведем
формальное определение мультифакториала:
fack(n) = n,
если k ≥ n;
fack(n) = n
* fack(n – k), если k < n;
По заданным n
и k следует вычислить fack(n). Если результат
будет строго больше 1018, то следует вывести “overflow”.
Вход. Два целых числа n и k (1 ≤ n, k
≤ 2 * 109).
Выход. Значение fack(n). Если оно
строго больше 1018, то вывести “overflow”.
Пример
входа 1 |
Пример
выхода 1 |
14 3 |
12320 |
|
|
Пример
входа 2 |
Пример
выхода 2 |
1000 2 |
overflow |
РЕШЕНИЕ
математика
Анализ алгоритма
Для решения
задачи достаточно непосредственно вычислить значение fack(n),
используя его формальное определение.
Реализация алгоритма
Читаем входные
данные. В переменной res будем накапливать результат. Переменная flag
установится равной 1, как только значение res станет строго больше 1018.
scanf("%d
%d",&n,&k);
res = 1;
flag = 0;
Запускаем цикл вычисления мультифакториала fack(n).
Если в процессе вычислений просто сравнивать значение res с 1018,
то при выполнении последнего умножения может возникнуть переполнение
(переменная res имеет тип знакового 64 битового целого). Поэтому перед
выполнением умножения следует проверить условие переполнения res * n
> 1018, которое эквивалентно res > 1018 / n.
for(; n > 0; n -= k)
{
if (1e18 / n < res)
{
flag = 1;
break;
}
res *= n;
}
В зависимости от
значения переменной flag выводим ответ.
if (flag) puts("overflow");
else printf("%lld\n",res);