4+1  4+2

  2+2+1  ! 4+1+1

  2+1+1+1  2+2+2

  1+1+1+1+1  ! 2+2+1+1

  ! 2+1+1+1+1

  ! 1+1+1+1+1+1

Теперь выпишем строки, оставшиеся непомеченными, то есть те, которые добавлены по другому закону (как раз и определяющему наше X):

  4+2

  2+2+2

Интересно, что все они составлены из четных чисел. Поделим все эти числа на 2, получим

  2+1

  1+1+1

А теперь обращаем внимание, что это как раз разложение числа 3, которое можно получить из числа 6 тоже делением на 2. Итого получаем X=K(i div 2)

А окончательное рекуррентное соотношение имеет вид

  K(i-1), если i нечетное и  K(i-1)+K(i div 2), если i четное.

Второй тестовый пример

  N=7  N=8

  4+2+1  8

  4+1+1+1  4+4

  2+2+2+1  4+2+2

  2+2+1+1+1  ! 4+2+1+1

  2+1+1+1+1+1  ! 4+1+1+1+1

  1+1+1+1+1+1+1  2+2+2+2

  ! 2+2+2+1+1

  ! 2+2+1+1+1+1

  ! 2+1+1+1+1+1+1

  ! 1+1+1+1+1+1+1+1

Непомеченными остались строки:

  8

  4+4

  4+2+2

  2+2+2+2

После деления всех чисел на 2 получим

  4

  2+2

  2+1+1

  1+1+1+1

А это как раз и есть разложение числа 4, которое может быть получено из исходного N=8 делением на 2. И тогда полное решение задачи может состоять в рекуррентном заполнении массива K[1..N] и выводе значения K[N].

Можно также заметить, что k[2]=k[1]+k[2 div 2]=k[1]+k[1]=2

То есть k[2] можно вычислять общим порядком. Достаточно задать только начальное значение k[1]. Вот полное (!) решение данной задачи:

НЕ нашли? Не то? Что вы ищете?

program by00m1t2;

var

  N, i  : longint;

  K  : array [1..1000] of longint;

begin

  assign (input,'sum. in'); reset(input);

  assign (output,'sum. out'); rewrite(output);

  readln (N);

  k[1]:=1;

  for i:=2 to N do

  if odd(i)

  then k[i]:=k[i-1]

  else  k[i]:=k[i-1] + k [i div 2];

  writeln(K[N]);

  close (input); close (output);

end.

Задача 13 "Отбор в разведку"

Из N солдат, выстроенных в шеренгу, требуется отобрать нескольких в разведку. Для того, что бы сделать это, выполняется следующая операция: если солдат в шеренге больше чем 3, то удаляются все солдаты стоящие на четных позициях, или все солдаты, стоящие на нечетных позициях. Эта процедура повторяется до тех пор, пока в шеренге останется 3 или менее солдат. Их и отсылают в разведку. Подсчитайте сколькими способами могут быть сформированы таким образом группы разведчиков ровно из трех человек.

Решение.

Обозначим K(N) - количество способов, которым можно сформировать группы разведчиков из N человек в шеренге.

По условию задачи K(1) = 0, K(2)=1, K(3)=1, то есть из трех человек можно сформировать только одну группу, из одного или двух - ни одной.

Рассмотрим теперь случай с произвольным числом N солдат в шеренге.

Если N число четное, то применяя определенную в задаче операцию удаления солдат в шеренге, мы получим в качестве оставшихся либо N div 2 солдат стоящих на четных позициях, либо N div 2 солдат, стоящих на нечетных позициях. А общее количество способов можно найти по формуле: K(N) = 2 * K(N div 2) (если N четное). Количество способов сформировать группу разведки из солдат, оставшихся на четных позициях плюс количество способов сформировать группу разведки из солдат, оставшихся на нечетных позициях. Если N число нечетное, то у нас останется либо N div 2 солдат стоявших на четных позициях, либо (N div 2)+1 солдат, стоявших на нечетных позициях. А общее количество способов можно найти по формуле: K(N) = K(N div 2) + K((N div 2)+1) (если N нечетное)

Таким образом, рекуррентное соотношение имеет вид: / 0, если N=1 или N=2,  K(N) = 1, если N=3, K(N) = 2* K(N div 2),  если N -  четное, K(N) = K(N div 2) + K((N div 2)+1), если N – нечетное.

Применив рекурсивное вычисление рекуррентной величины K(N), получаем алгоритм:

{$m 65520,0,0}

program problem13;

var  N : longint;

  function K(N:longint):longint;

  begin

  if N<3

  then  K:=0  else  if N=3

  then K:=1

  else  if odd(N)

  then  K:= K(N div 2) + K(N div 2 + 1)

  else  K:= 2 * K(N div 2);

  end;

begin

  assign(input,'input. txt'); reset(input);

  assign(output,'output. txt'); rewrite(output);

  read(N);

  writeln(K(N));

  close(input); close(output);

end.

Список литературы

1.  , Марченко в среде TURBO PASCAL 7.0. – М.: Бином Универсал, 1998.

2.  , , Кузьмич для персональных  компьютеров. – Мн.: Вышэйшая школа, 1991.

3.  , Бушмелева по Турбо Паскалю. - Киров, 1997.

4.    Лекции. Общие сведения о рекуррентных соотношениях. – Гомель, 2005.

5. Журнал «Репетитор» № 9. – Мн:, 2001.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5