1422 - Ograda

From Bitnami MediaWiki
Revision as of 10:54, 25 April 2023 by Alexandra Leș (talk | contribs) (→‎Exemplu2)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Enunţ[edit | edit source]

În ograda lui Gigel se găsesc găini și văcuțe. Se dau două numere naturale: C – numărul de capete și P – numărul de picioare din curte.

Cerinţa[edit | edit source]

1. Să se afișeze câte găini și câte văcuțe sunt în ograda lui Gigel. 2. Maria, colega lui Gigel, îl provoacă pe acesta să calculeze numărul de divizori impari pentru numărul C și numărul de divizori pari pentru numărul P. Deoarece Gigel nu este bun la matematică, vă cere ajutorul. Să se afișeze cele două numere calculate

Date de intrare[edit | edit source]

Fișierul de intrare ograda.in conține pe prima linie un număr natural X (1 sau 2) reprezentând numărul cerinței ce trebuie rezolvată.

A doua linie conține două numere C și P, separate printr-un spațiu, cu semnificațiile din cerință.

Date de ieşire[edit | edit source]

Dacă datele sunt introduse corect, pe ecran se va afișa:"Datele sunt introduse corect.", apoi pe urmatorul rand fișierul de ieșire ograda.out va conține: Pentru cerința 1: pe prima linie se vor afișa două numere, separate printr-un spațiu, G și V reprezentând numărul de găini, respectiv numărul de văcuțe din ogradă. Pentru cerința 2: pe prima linie se vor afişa două numere, separate printr-un spațiu, reprezentând numărul de divizori impari pentru numărul C și numărul de divizori pari pentru numărul P. În cazul în care datele nu respectă restricțiile, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse."

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

  • C și P ∈ Ν , 2*C ⩽ P ⩽ 4*C, iar P este un număr par.
  • Pentru cerința 1:C,P ⩽ 200000000000
  • Pentru cerința 2: C, P ⩽50000000
  • 0 ⩽ numar1 ⩽ numar2 ⩽ 1.000.000.000
  • Se consideră că toate găinile au 2 picioare și 1 cap, iar toate văcuțele au 4 picioare și 1 cap. Gigel nu se
  • află în ogradă în momentul numărării capetelor și picioarelor.
  • Pentru X = 1 se va rezolva doar cerința 1. Pentru X = 2 se va rezolva doar cerința 2.
  • d este divizorul lui a dacă restul împărţirii lui a la d este 0.

Exemplul 1[edit | edit source]

ograda.in
1
5 16
ograda.out
Datele sunt introduse corect.
2 3

Explicație[edit | edit source]

Cerința este 1. În ogradă sunt 2 găini și 3 văcuțe.

Exemplul 2[edit | edit source]

ograda.in
2
5 16
ograda.out
Datele sunt introduse corect.
2 5

Explicație[edit | edit source]

Cerința este 2. Numărul 5 are 2 divizori impari (1 și 5), iar numărul 16 are 4 divizori pari (2, 4, 8, 16).

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. Verificăm dacă toate valorile de intrare respectă restricțiile

def validare_date(C, P, X):

   if not (isinstance(C, int) and isinstance(P, int) and isinstance(X, int)):
       return False
   if not (0 < C <= 200000000000 and 0 < P <= 200000000000):
       if X == 1:
           return False
       elif not (0 < C <= 50000000 and 0 < P <= 50000000):
           return False
   if not (2 * C <= P <= 4 * C and P % 2 == 0):
       return False
   return True

if __name__ == "__main__":

   # Citire date de intrare
   with open("ograda.in", "r") as f:
       X = int(f.readline())
       C, P = map(int, f.readline().split())
   # Verificare validare date
   if validare_date(C, P, X):
       with open("ograda.out", "w") as f_out:
           f_out.write("Datele sunt introduse corect.\n")
       # Rezolvare cerinta 1
       if X == 1:
           # Numarul total de capete
           t = C
           # Numarul total de picioare
           l = P
           # Numarul de gaini (cu 2 picioare si 1 cap)
           g = (4*t - l) // 2
           # Numarul de vacute (cu 4 picioare si 1 cap)
           v = t - g
           # Afisare rezultat
           with open("ograda.out", "a") as f_out:
               f_out.write(str(g) + " " + str(v))
       # Rezolvare cerinta 2
       elif X == 2:
           # Numarul de divizori impari pentru numarul C
           d1 = 1
           for i in range(3, C+1, 2):
               if C % i == 0:
                   d1 += 1
           # Numarul de divizori pari pentru numarul P
           d2 = 1
           for i in range(2, P+1, 2):
               if P % i == 0:
                   d2 += 1
           # Afisare rezultat
           with open("ograda.out", "a") as f_out:
               f_out.write(str(d1) + " " + str(d2))
   else:
       with open("ograda.out", "w") as f_out:
           f_out.write("Datele nu corespund restricțiilor impuse.")


</syntaxhighlight>