19 for (
unsigned char i = 2; i <= n; ++i) {
25 uintmax_t
n_choose_r(
const unsigned int n,
const unsigned int r) {
35 signed char *factors = (
signed char *) malloc(
sizeof(
signed char) * (n + 1));
39 signed char factors[n+1];
44 for (
unsigned int i = r + 1; i <= n; i++)
46 for (
unsigned int i = 2; i <= r; i++)
48 for (
unsigned int i = 2; i <= n - r; i++)
51 for (
unsigned int i = n; i > 1; i--) {
52 for (
unsigned int j = 2; j < i; j++) {
54 factors[j] += factors[i];
55 factors[i / j] += factors[i];
62 unsigned int div_idx = 2;
63 for (
unsigned int mul_idx = 2; mul_idx <= n; mul_idx++) {
64 while (factors[mul_idx] > 0) {
65 uintmax_t prev = answer;
67 for (; answer < prev && div_idx <= n; div_idx++) {
69 while (factors[div_idx] < 0) {
73 answer = prev * mul_idx;
85 for (; div_idx <= n; div_idx++) {
86 while (factors[div_idx] < 0) {
#define MAX_FACTORIAL_128
uintmax_t n_choose_r(const unsigned int n, const unsigned int r)
Definition: math.h:25
uintmax_t factorial(unsigned char n)
Definition: math.h:14