Bayraqlar#9558

Bayraqlar (Həll təhlili)

Tutaq ki:

f_r(n) funksiyasının hesablanmasını nəzərdən keçirək:

Beləliklə, bərabərlik alırıq:

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

Oxşar fikir yürüdərək alırıq:

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

Birinci rekursiyanın başlanğıc şəraitləri açıqdır:

Eyni şəkildə

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

Hər iki funksiya — həm f_r(n) həm də f_w(n) Fibonacci ədədlərini təyin edir:

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

Bayrağın boyaması birinci zolaqdan başlayır. O ya qırmızı, ya da ağ ola bilər. Buna görə ümumi bayrağı boyamaq üsullarının sayı

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

Algoritmin həyata keçirilməsi

Konstantları elan edək.

#define MAX 1000001
#define MOD 1000000007

Fibonacci ədədlərini saxlamaq üçün arrayini elan edək.

long long fib[MAX];

Giriş dəyəri oxuyuruq.

scanf("%d", &n);

arrayini Fibonacci ədədləri ilə doldururuq.

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

Cavabı çıxarırıq.

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