Найдите количество
способов полностью покрыть прямоугольник размером 2 × n доминошками 2 × 1. Покрытия, которые совпадают с собой при симметриях
(повороты или отражения), считаются разными.
Вход. Одно целое число n (0 < n < 65536).
Выход. Выведите количество способов покрытия прямоугольника
доминошками.
![]()
|
Пример
входа 1 |
Пример
выхода 1 |
|
1 |
1 |
|
|
|
|
Пример
входа 2 |
Пример
выхода 2 |
|
4 |
5 |
числа
Фибоначчи
Обозначим через f(n)
количество
способов покрыть прямоугольник 2 × n доминошками 2 × 1. Очевидно,
что
·
f(1) = 1, одна вертикальная доминошка;
·
f(2) = 2, либо две вертикальные, либо две горизонтальные доминошки.

Рассмотрим
алгоритм вычисления f(n):
·
можно положить одну доминошку вертикально, после чего
оставшийся прямоугольник длины n – 1 покрывается f(n – 1)
способом,
·
либо положить две доминошки горизонтально, после чего
оставшийся прямоугольник длины n – 2 покрывается f(n – 2)
способами.
Таким образом, получаем
рекуррентное соотношение:
f(n) = f(n
– 1) + f(n – 2)

Таким образом, f(n)
является числом Фибоначчи.

Поскольку n < 65536, то следует воспользоваться
длинной арифметикой или языком программирования Java.
import java.util.*;
import java.math.*;
public class Main
{
public static void main(String[] args)
{
Scanner con = new Scanner(System.in);
int n = con.nextInt();
BigInteger a = new BigInteger("1"), b = a;
for(int i = 0; i < n; i++)
{
BigInteger temp = a.add(b);
a = b;
b = temp;
}
System.out.println(a);
con.close();
}
}
Увеличиваем
лимит до нужного числа (например, 100000 цифр)
import sys
sys.set_int_max_str_digits(100000)
Читаем входное
число n.
n = int(input())
Обрабатываем
базовые случаи.
if n == 1:
print(1)
elif n == 2:
print(2)
else:
Вычисляем n-ое число Фибоначчи.
f1, f2 = 1, 2
for i in range(n - 2):
temp = f1 + f2
f1, f2 = f2, temp
Выводим ответ.
print(f2)