Kosa Nostro#5103

Kosa Nostro (Həll təhlili)

Tutaq ki, — xət ilə düzülmüş müəllimə kartları paylama üsullarının sayıdır (bu zaman ilk və sonuncu qonşu hesab edilmir). Bu məsələ, heç bir iki ədədinin yan-yana olmadığı uzunluqları olan ikilik ardıcıllıqların sayını hesablamaqla ekvivalentdir. Həll Fibonaccinin ardıcıllığıdır ki, aşağıdakı rekursiv düsturla verilir:

g(n)= \begin{cases} 2, n = 1, \\ 3, n = 2, \\ g(n - 1) + g(n - 2), n \ge 3. \end{cases}

Tutaq ki, — dairəvi şəkildə yerləşən müəllimə kart paylama üsullarının sayıdır.

Beləliklə, aşağıdakı ifadəni alırıq:

f(n) = g(n - 1) + g(n - 3),~əgər~n \ge 3

Nümunə

n = 3 üçün bizə dəyəri lazım olacaq. Bu g(0) + g(1) = g(2) bərabərliyindən tapıla bilər, buradan isə

g(0) = g(2) - g(1) = 3 - 2 = 1

Beləliklə

f(3) = g(2) + g(0) = 3 + 1 = 4

Əsas hallar aşağıdakı kimidir:

f(1) = 2 \\ f(2) = 3

Alqoritmin reallaşdırılması

Fibonacci ədədlərini saxlamaq üçün massivi elan edirik.

#define MAX 46
int fib[MAX];

Proqramın əsas hissəsi. Fibonacci ədədlərini hesablayırıq.

fib[0] = 1; fib[1] = 2;
for (int i = 2; i < MAX; i++)
  fib[i] = fib[i - 1] + fib[i - 2];

Girişdə olan ədədini oxuyuruq.

scanf("%d", &n);

Cavab -i hesablayırıq.

if (n == 1) res = 2; else 
if (n == 2) res = 3; else
res = fib[n - 1] + fib[n - 3];

Cavabı çap edirik.

printf("%d\n", res);

Java reallaşdırılması

import java.util.*;

public class Main 
{
  private static final int MAX = 46;
  public static void main(String[] args) 
  {

Fibonacci ədədlərini saxlamaq üçün massivi elan edirik.

    int[] fib = new int[MAX];

Fibonacci ədədlərini hesablayırıq.

    fib[0] = 1;
    fib[1] = 2;
    for (int i = 2; i < MAX; i++)
      fib[i] = fib[i - 1] + fib[i - 2];

Girişdə olan ədədini oxuyuruq.

    Scanner con = new Scanner(System.in);
    int n = con.nextInt();

Cavab -i hesablayırıq.

    int res;
    if (n == 1) res = 2;
    else if (n == 2) res = 3;
    else res = fib[n - 1] + fib[n - 3];

Cavabı çap edirik.

    System.out.println(res);
  }
}

Python reallaşdırılması

Fibonacci ədədlərini saxlamaq üçün siyahısı elan edirik.

fib = [0] * 46

Fibonacci ədədlərini hesablayırıq.

fib[0] = 1
fib[1] = 2
for i in range(2, 46):
  fib[i] = fib[i - 1] + fib[i - 2]

Girişdə olan ədədini oxuyuruq.

n = int(input())

Cavab -i hesablayırıq.

if n == 1: res = 2
elif n == 2: res = 3
else: res = fib[n - 1] + fib[n - 3]

Cavabı çap edirik.

print(res)