2020-05-27 21:21:54 +08:00
|
|
|
/**
|
|
|
|
* @file
|
2020-05-28 02:07:05 +08:00
|
|
|
* @brief Compute double factorial: \f$n!!\f$
|
|
|
|
*
|
2020-05-27 21:21:54 +08:00
|
|
|
* Double factorial of a non-negative integer n, is defined as the product of
|
|
|
|
* all the integers from 1 to n that have the same parity (odd or even) as n.
|
2020-05-28 00:55:03 +08:00
|
|
|
* <br/>It is also called as semifactorial of a number and is denoted by
|
|
|
|
* \f$n!!\f$
|
2020-05-27 21:21:54 +08:00
|
|
|
*/
|
2020-04-25 02:01:14 +08:00
|
|
|
|
2020-05-27 21:21:54 +08:00
|
|
|
#include <cassert>
|
|
|
|
#include <iostream>
|
2020-04-25 02:01:14 +08:00
|
|
|
|
2020-05-28 02:07:05 +08:00
|
|
|
/** Compute double factorial using iterative method
|
|
|
|
*/
|
2020-04-26 03:37:50 +08:00
|
|
|
uint64_t double_factorial_iterative(uint64_t n) {
|
2020-05-27 21:21:54 +08:00
|
|
|
uint64_t res = 1;
|
2020-05-28 00:54:42 +08:00
|
|
|
for (uint64_t i = n;; i -= 2) {
|
2020-05-27 21:21:54 +08:00
|
|
|
if (i == 0 || i == 1) return res;
|
|
|
|
res *= i;
|
|
|
|
}
|
2020-05-28 00:54:42 +08:00
|
|
|
return res;
|
2020-04-25 02:01:14 +08:00
|
|
|
}
|
|
|
|
|
2020-05-28 02:07:05 +08:00
|
|
|
/** Compute double factorial using resursive method.
|
|
|
|
* <br/>Recursion can be costly for large numbers.
|
|
|
|
*/
|
2020-04-26 03:37:50 +08:00
|
|
|
uint64_t double_factorial_recursive(uint64_t n) {
|
2020-05-27 21:21:54 +08:00
|
|
|
if (n <= 1) return 1;
|
|
|
|
return n * double_factorial_recursive(n - 2);
|
2020-04-25 02:01:14 +08:00
|
|
|
}
|
|
|
|
|
2020-05-27 21:21:54 +08:00
|
|
|
/// main function
|
2020-04-26 03:34:44 +08:00
|
|
|
int main() {
|
2020-05-28 00:55:03 +08:00
|
|
|
uint64_t n;
|
2020-05-27 21:21:54 +08:00
|
|
|
std::cin >> n;
|
|
|
|
assert(n >= 0);
|
|
|
|
std::cout << double_factorial_iterative(n);
|
2020-04-25 02:01:14 +08:00
|
|
|
}
|