Untitled

 avatar
unknown
plain_text
4 days ago
2.1 kB
3
Indexable
from functools import lru_cache

# Zapamiętywanie wyników obliczeń
@lru_cache(None)
def lucas(n):
    if n == 0:
        return 2
    elif n == 1:
        return 1
    return lucas(n - 1) + lucas(n - 2)

def generowanie_ciagu_lucasa(limit): #Generuje ciąg Lucasa do wartości mniejszej niż maksymalna liczba w danych
    ciag_lucasa = []
    n = 0
    while True:
        value = lucas(n)
        if value > limit:
            break
        ciag_lucasa.append(value)
        n += 1
    return ciag_lucasa

def max_lucas_below(x, ciag_lucasa): #zwraca największą liczbę mniejszą lub równą x
    for value in reversed(ciag_lucasa):  # zaczynamy od największej liczby
        if value <= x:
            return value
    return 0

# Odczyt danych z pliku
with open('01.in', 'r') as file:
    dane = list(map(int, file.read().split()))
dane.pop(0)
print(dane)


# generujemy wszystkie elementy ciagu lucasa az do wartosci najwiekszej z pliku danych
max_value = max(dane)
ciag_lucasa = generowanie_ciagu_lucasa(max_value)

# Dla każdego elementu chcemy wyliczyć najkrótszą reprezentację
for element in dane:
    dlugosc_z_minusem = 0
    dlugosc_z_plusem = 0
    czy_znaleziono = False
    suma_wyrazow_ciagu_lucasa = 0
    x = element

    while not czy_znaleziono:
        najwieksza_mniejsza = max_lucas_below(x, ciag_lucasa)
        dlugosc_z_plusem += 1
        suma_wyrazow_ciagu_lucasa += najwieksza_mniejsza

        # Obliczamy resztę
        reszta = x - suma_wyrazow_ciagu_lucasa

        # Dopóki suma nie jest równa elementowi, kontynuujemy poszukiwania
        while reszta > 0:
            najwieksza_mniejsza_reszta = max_lucas_below(reszta, ciag_lucasa)
            dlugosc_z_plusem += 1
            suma_wyrazow_ciagu_lucasa += najwieksza_mniejsza_reszta
            reszta = reszta - najwieksza_mniejsza_reszta

        # Jeśli suma wyrazów jest równa elementowi, znaleziono odpowiednią reprezentację
        if suma_wyrazow_ciagu_lucasa == element:
            czy_znaleziono = True

    print(dlugosc_z_plusem)
Leave a Comment