2053 - Fibo Div

From Bitnami MediaWiki

Enunt[edit | edit source]

Fie șirul Fibonacci, dat prin F[1] = 1, F[2] = 1 și relația de recurență F[k] = F[k-1] + F[k-2], k ≥ 3 . Se consideră un număr natural N și un șir A[1], A[2],...,A[N] de N numere naturale distincte. Se consideră de asemenea și un număr natural T.

Cerinţa[edit | edit source]

Să se scrie un program care determină o valoare D ce reprezintă numărul termenilor din șirul Fibonacci F[1], F[2] ,..., F[T] care sunt divizibili cu cel puțin unul dintre numerele A[1], A[2],...,A[N].

Date de intrare[edit | edit source]

Fișierul de intrare fibodiv.in conţine pe prima linie numerele N și T separate printr-un spațiu, iar pe a doua linie N numere naturale, A[1], A[2],...,A[N], separate prin câte un spațiu.

Date de ieșire[edit | edit source]

Fișierul de ieșire fibodiv.out va conţine pe prima linie numărul natural D,cu semnificația de mai sus.

Restricţii şi precizări[edit | edit source]

  • 1 ≤ N ≤ 15
  • 2 ≤ T ≤ 1018
  • 2 ≤ A[i] ≤ 50, 1 ≤ i ≤ N

Exemplul 1[edit | edit source]

fibodiv.in
 3 20
 3 6 10
fibodiv.out
 6

Explicație[edit | edit source]

N = 3; T = 20; A1 = 3, A2 = 6, A3 = 10. Primii 20 de termeni ai șirului Fibonacci sunt: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765. Printre aceștia se găsesc 6 termeni divizibili cu cel puțin unul dintre numerele 3, 6, 10 și anume: 3, 21, 144, 610, 987, 6765.


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line> def fibonacci_sequence(n):

   fib = [1, 1]
   for i in range(2, n):
       fib.append(fib[i - 1] + fib[i - 2])
   return fib

def count_divisible_terms(fib_sequence, divisors):

   count = 0
   for term in fib_sequence:
       for divisor in divisors:
           if term % divisor == 0:
               count += 1
               break
   return count

def main():

   with open("fibodiv.in", "r") as fin:
       N, T = map(int, fin.readline().split())
       divisors = list(map(int, fin.readline().split()))
   fib_sequence = fibonacci_sequence(T)
   count = count_divisible_terms(fib_sequence, divisors)
   with open("fibodiv.out", "w") as fout:
       fout.write(str(count) + "\n")

if __name__ == "__main__":

   main()

</syntaxhighlight>