Прапори#9558

Прапори (Розбір)

Нехай:

Розглянемо обчислення функції f_r(n):

Отже, маємо рівність:

f_r(n) = f_w(n - 1) + f_w(n - 2)

Аналогічними міркуваннями отримуємо:

f_w(n) = f_r(n - 1) + f_r(n - 2)

Початкові умови для першої рекурентності очевидні:

Аналогічно

f_w(1) = 1, f_w(2) = 1

Обидві функції — і f_r(n) і f_w(n) задають числа Фібоначчі:

f_r(n) = F_n, \\ f_w(n) = F_n

Розмальовування прапора починається з першої смуги. Вона може бути або червоною, або білою. Отже, загальна кількість способів розмалювати прапор дорівнює

f_r(n) + f_w(n) = 2 * F_n

Реалізація алгоритму

Оголосимо константи.

#define MAX 1000001
#define MOD 1000000007

Оголосимо масив для зберігання чисел Фібоначчі.

long long fib[MAX];

Читаємо вхідне значення .

scanf("%d", &n);

Заповнюємо масив числами Фібоначчі.

fib[1] = 1; fib[2] = 1;
for (i = 3; i < MAX; i++) 
  fib[i] = (fib[i - 1] + fib[i - 2]) % MOD;

Виводимо відповідь.

printf("%lld\n", (2 * fib[n]) % MOD);