1265 - giovanacci
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()