1265 - giovanacci

De la Universitas MediaWiki

Cerința

Șirul Fibonacci este definit după regula:

  • F1=1
  • F2=1
  • Fn=Fn–1+Fn–2

Comisia mafioților îl supune pe Giovanni la T teste. Pentru fiecare test se dau n și apoi n numere naturale pos1,pos2,…,posn reprezentând poziții în șirul Fibonacci. Se cere să se găsească cel mai mare număr g care divide Fpos1,Fpos2,…,Fposn. Comisia a înțeles că Giovanni nu poate reține numere mari, așa că îi cere să afișeze restul împărțirii lui g la numărul p. Fiind depășit de cerință, mafiotul are opțiunea să sune publicul și vă contactează pe voi. Ajutați-l pe Giovanni să-și mențină demnitatea și el vă va răsplăti cu un punctaj pe măsură.

Date de intrare

Fișierul de intrare giovanacciin.txt conține pe prima linie numerele T și p, iar pe următoarele T linii n, urmat de n numere naturale.

Date de ieșire

Fișierul de ieșire giovanacciout.txt va conține cele T răspunsuri, câte unul pe linie.

Restricții și precizări

  • 1 ⩽ T ⩽ 1000
  • 2 ⩽ p ⩽ 100000
  • 1 ⩽ n ⩽ 1000
  • 1 ⩽ posi ⩽ 100000000000000000

Exemplu 1

giovanacciin.txt
2 2
3 6 9 12
2 5 10
giovanacciout.txt
0
1
Datele corespund


Exemplu 2

giovanacciin.txt
0 0
0 0
giovanacciout.txt
Nu au fost respectate cerintele impuse


Rezolvare

#1265 - Giovanacci
def fibonacci(n):
    fib = [0, 1]
    for i in range(2, n + 1):
        fib.append(fib[i - 1] + fib[i - 2])
    return fib

def find_largest_divisor_modulo_p(n, positions, p):
    fib_sequence = fibonacci(max(positions))
    largest_divisor = 0

    for pos in positions:
        if fib_sequence[pos] > largest_divisor:
            largest_divisor = fib_sequence[pos]

    return largest_divisor % p

def main():
    try:
        # Citirea datelor de intrare din fișier
        with open("giovanacciin.txt", "r") as input_file:
            T, p = map(int, input_file.readline().strip().split())
            tests = [list(map(int, input_file.readline().strip().split()[1:])) for _ in range(T)]
    except FileNotFoundError:
        print("Fișierul giovanacciin.txt nu există.")
        return
    except ValueError:
        print("Datele de intrare nu sunt valide.")
        return

    # Verificare dacă datele de intrare corespund cerințelor impuse
    if 1 <= T <= 1000 and 2 <= p <= 100000 and all(1 <= len(test) <= 1000 and all(1 <= posi <= 100000000000000000 for posi in test) for test in tests):
        # Calcularea rezultatelor și scrierea în fișierul de ieșire
        with open("giovanacciout.txt", "w") as output_file:
            for test in tests:
                result = find_largest_divisor_modulo_p(test[0], test[1:], p)
                output_file.write(str(result) + "\n")
            output_file.write("Datele corespund\n")
    else:
        with open("giovanacciout.txt", "w") as output_file:
            output_file.write("Nu au fost respectate cerintele impuse\n")
if __name__ == "__main__":
    main()