4006 - Partitie AB

From Bitnami MediaWiki

Cerința[edit | edit source]

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[edit | edit source]

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

Date de ieșire[edit | edit source]

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

Restricții și precizări:[edit | edit source]

  • 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:[edit | edit source]

Intrare

40 3 5

Iesire

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

Rezolvare[edit | edit source]

<syntaxhighlight lang="python"> 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()

</syntaxhighlight>