4006 - Partitie AB

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

Cerința

Se dau trei numere naturale n a b, 1 ≤ a < b < n. Să se determine o modalitate de a-l scrie pe n ca sumă de termeni egali cu a sau b în care numărul de termeni egali cu a este maxim.

Date de intrare

Programul citește de la tastatură numerele n a b.

Date de ieșire

Programul va afișa pe ecran un șir de numere ordonate crescător, reprezentând termenii ceruți.

Restricții și precizări:

  • 1 ≤ n ≤ 1.000.000
  • 1 ≤ a < b ≤ 1000
  • pentru toate datele de test n poate fi scris ca sumă de termeni egali cu a și b.

Exemplu:

Intrare

40 3 5

Iesire

3 3 3 3 3 3 3 3 3 3 5 5

Rezolvare

def validare_date(n, a, b):
    return 1 <= n <= 1000000 and 1 <= a < b <= 1000

def scrie_n_ca_suma(n, a, b):
    if n - b < b:
        a, b = b, a

    rezultat = []

    termeni_a = (n - b) // a

    for _ in range(termeni_a):
        rezultat.append(a)

    for _ in range((n - b) - (termeni_a * a)):
        rezultat.append(b)

    return sorted(rezultat)

def main():
    n = int(input("Introduceți valoarea lui n: "))
    a = int(input("Introduceți valoarea lui a: "))
    b = int(input("Introduceți valoarea lui b: "))

    if validare_date(n, a, b):
        rezultat = scrie_n_ca_suma(n, a, b)
        print("Termenii ceruți:", rezultat)
    else:
        print("Verificați condițiile: 1 ≤ n ≤ 1.000.000, 1 ≤ a < b ≤ 1000!")

if __name__ == "__main__":
    main()