Нехай — це кількість способів роздати карти викладачам, вишикуваним у ряд (перший і останній при цьому не вважаються сусідами). Це завдання еквівалентне підрахунку бінарних послідовностей довжини , що складаються з та , у яких ніякі дві одиниці не стоять поруч. Рішенням є послідовність Фібоначчі, задана наступною рекурентною формулою:
Нехай — це кількість способів роздати карти викладачам, розташованим по колу.
Якщо першому викладачу туз не виданий, то решті n - 1 викладачам тузи можна роздати g(n - 1) способами.
Якщо ж першому викладачу виданий туз, то другому і останньому викладачам туз давати не можна. Тоді решті n - 3 викладачам тузи можна роздати g(n - 3) способами.
Таким чином, отримуємо співвідношення:
Приклад
При n = 3 нам знадобиться значення . Його можна знайти з рівності g(0) + g(1) = g(2), звідки
Отже
Базові випадки мають вигляд:
Реалізація алгоритму
Оголосимо масив для зберігання чисел Фібоначчі.
#define MAX 46
int fib[MAX];Основна частина програми. Обчислюємо числа Фібоначчі.
fib[0] = 1; fib[1] = 2;
for (int i = 2; i < MAX; i++)
fib[i] = fib[i - 1] + fib[i - 2];Читаємо вхідне число .
scanf("%d", &n);Обчислюємо відповідь .
if (n == 1) res = 2; else
if (n == 2) res = 3; else
res = fib[n - 1] + fib[n - 3];Виводимо відповідь.
printf("%d\n", res);Java реалізація
import java.util.*;
public class Main
{
private static final int MAX = 46;
public static void main(String[] args)
{Оголосимо масив для зберігання чисел Фібоначчі.
int[] fib = new int[MAX];Обчислюємо числа Фібоначчі.
fib[0] = 1;
fib[1] = 2;
for (int i = 2; i < MAX; i++)
fib[i] = fib[i - 1] + fib[i - 2];Читаємо вхідне число .
Scanner con = new Scanner(System.in);
int n = con.nextInt();Обчислюємо відповідь .
int res;
if (n == 1) res = 2;
else if (n == 2) res = 3;
else res = fib[n - 1] + fib[n - 3];Виводимо відповідь.
System.out.println(res);
}
}Python реалізація
Оголосимо список для зберігання чисел Фібоначчі.
fib = [0] * 46Обчислюємо числа Фібоначчі.
fib[0] = 1
fib[1] = 2
for i in range(2, 46):
fib[i] = fib[i - 1] + fib[i - 2]Читаємо вхідне число .
n = int(input())Обчислюємо відповідь .
if n == 1: res = 2
elif n == 2: res = 3
else: res = fib[n - 1] + fib[n - 3]Виводимо відповідь.
print(res)