LINUX.ORG.RU

История изменений

Исправление satanic-mechanic, (текущая версия) :

Хотя что-то не так, с повторениями вышло меньше, чем без повторений. :-\

Море решение для случая с повторениями (с учетом досадной ошибки использования купюры 1024):

#include <stdio.h>
#include <math.h>

static unsigned long
dec_c(int n)
{
  static unsigned long C[1025];
  int i, j;

  C[0] = 1;

  for (i = 1; i <= n; ++i)
    for (j = 1; j <= i && j <= 512; j <<= 1)
      C[i] += C[i - j];

  return C[n];
}

int
main(int argc, char *argv[])
{
  int n = 1024;
  if (argc > 1)
    n = atoi(argv[1]);

  printf("%lu\n", dec_c(n));

  return 0;
}

Выдает 12183728273700989960, что больше решения без повторений. Закономерно больше.

P.S. На переполнение не проверял.

Исходная версия satanic-mechanic, :

Море решение для случая с повторениями (с учетом досадной ошибки использования купюры 1024):

#include <stdio.h>
#include <math.h>

static unsigned long
dec_c(int n)
{
  static unsigned long C[1025];
  int i, j;

  C[0] = 1;

  for (i = 1; i <= n; ++i)
    for (j = 1; j <= i && j <= 512; j <<= 1)
      C[i] += C[i - j];

  return C[n];
}

int
main(int argc, char *argv[])
{
  int n = 1024;
  if (argc > 1)
    n = atoi(argv[1]);

  printf("%lu\n", dec_c(n));

  return 0;
}