1225. Флаги
Флаг состоит из n
вертикальных полос белого, красного и синего цвета. Соседние полосы не могут
иметь одинаковый цвет, а синяя полоса всегда должна находиться между красной и
белой. Сколькими способами можно покрасить флаг из n полос?
Вход. Число
полос n (1 £ n £ 45) на флаге.
Выход. Количество способов, которыми
можно покрасить флаг из n полос.
3
4
числа Фибоначчи
Обозначим через fred(n)
и fwhite(n) количество способов раскраски флага из n
полос при условии, что первой полосой будет соответственно красная или белая.
Тогда
fred(n) = fwhite(n
– 1) + fwhite(n – 2), fred(1) = 1, fred(2)
= 1;
fwhite(n) = fred(n
– 1) + fred(n – 2), fwhite(1) =
1, fwhite(2) = 1.
Если f(n) – искомое
общее количество способов раскраски, то
f(n) = fred(n)
+ fwhite(n)
Поскольку fred(1)
= fwhite(1) = 1, fred(2) = fwhite(2)
= 1, а fred(n) и fwhite(n)
одинаковыми формулами выражаются друг через друга, то fred(n)
= fwhite(n) = fn,
где fn – n-ое число Фибоначчи. Таким образом f(n)
= 2 * fn.
В массиве fib вычислим значения fred(n):
fred(n) = fib[n].
Для n > 44 значения fred(n) будут выходить
за границы типа int, поэтому воспользуемся 64 - битовым целочисленным типом
__int64.
__int64 fib[46];
Читаем входное значение n. Нахождение значения fib[n]
совершим в цикле:
scanf("%d",&n);
fib[1] = 1; fib[2] = 1;
for(i=3;i<=n;i++) fib[i] = fib[i-1] + fib[i-2];
Выводим результат f(n) = 2* fred(n)
= 2 * fib[n]:
printf("%I64d\n",2*fib[n]);