Задание 16. Информатика. Статград-22-3-2

Алгоритм вычисления значения функции \(F(n)\), где \( n \) — целое неотрицательное число, задан следующими соотношениями:

\( F(0) = 0\);
\( F(n) = F(n-1) + 1\), если \(n\) нечётно;
\( F(n) = F(n/2)\), если \( n >0\) и при этом \( n \) чётно.

Укажите количество таких значений \( n < 1~000~000~000\), для которых \( F(n) = 3\).

Решение:

Python

На Пайтоне указанный алгоритм можно записать так.

Однако выполняться такой алгоритм при больших \(n\) будет очень долго. Значит для решения этой задачи нужны другие соображения. Легко заметить, что функция \( F(n)\) есть ни что иное, как подсчёт числа единиц в двоичной записи числа. Поэтому задачу решает более простой цикл:

Эту же задачу можно решить и не особо программируя. В командной строке Пайтона определяем разрядность числа \( 1~000~000~000\) в двоичной записи.

Осталось определить, сколькими способами можно разместить три единицы по тридцати позициям: $$ C^2_{30} = \frac{30!}{3! \, 27!} = \frac{28 \cdot 29 \cdot 30}{6} = 4060. $$

Ответ: 4060