2448 - Pătrate3: Difference between revisions

From Bitnami MediaWiki
Dragos1234 (talk | contribs)
Pagină nouă: Sursa: [https://www.pbinfo.ro/probleme/1473/grupapregatitoare] == Cerinţa == Cei n elevi de la grupa pregătitoare au primit câte două cartonaşe, fiecare cartonaş având scris pe el un număr natural. Ei s-au aşezat în cerc şi, la un semnal dat, fiecare a scos la întâmplare un cartonaş din buzunar. Copiii vă roagă să răspundeţi la următoarele întrebări: 1. Care poate fi suma maximă S a numerelor de pe cartonaşele scoase, ştiind că produsul acestora este...
 
Dragos1234 (talk | contribs)
 
(26 intermediate revisions by 2 users not shown)
Line 1: Line 1:
Sursa: [https://www.pbinfo.ro/probleme/1473/grupapregatitoare]
Sursa: [https://www.pbinfo.ro/probleme/2448/patrate3]
== Cerinţa ==
== Cerinţa ==
Cei n elevi de la grupa pregătitoare au primit câte două cartonaşe, fiecare cartonaş având scris pe el un număr natural. Ei s-au aşezat în cerc şi, la un semnal dat, fiecare a scos la întâmplare un cartonaş din buzunar. Copiii vă roagă să răspundeţi la următoarele întrebări:
Scrieţi un program care rezolvă următoarele două cerinţe:
1. Care poate fi suma maximă S a numerelor de pe cartonaşele scoase, ştiind că produsul acestora este divizibil cu un număr prim p?
 
2. Care poate fi lungimea maximă L a unei secvenţe de copii de pe cerc pentru care suma numerelor de pe cartonaşele scoase de către oricare doi vecini din secvenţă este pară?
1. Citește un număr natural M și determină numărul K de valori conținute de pătratul numerotat cu M;
 
2. Citește un număr natural N și determină numărul T al pătratului care conține numărul N pe una dintre laturi.
 
== Date de intrare ==
== Date de intrare ==
Fișierul de intrare '''grupapregatitoare.in''' conține pe prima linie numerele '''n''' şi '''p''', iar pe următoarele n linii câte două numere naturale reprezentând numerele de pe cartonaşele fiecărui elev, în ordinea în care s-au aşezat pe cerc
Fișierul de intrare '''patrate3.in''' conține pe prima linie un număr natural C reprezentând cerința din problemă care trebuie rezolvată (1 sau 2). Dacă C = 1, atunci fişierul conține pe a doua linie numărul natural M. Dacă C = 2, atunci fișierul conține pe a doua linie numărul natural N.


== Date de ieșire ==  
== Date de ieșire ==  
Programul va afișa pe ecran, mesajul "Datele introduse corespund cerințelor" si fișierul de ieșire '''grupapregatitoare.out''' va conține pe prima linie numărul '''S''', iar pe a doua linie numărul '''L'''. În caz contrar programul va afișa pe o linie noua mesajul "Datele introduse nu corespund cerintelor.".
Dacă C = 1, atunci fişierul de ieşire '''patrate3.out''' conţine pe prima linie numărul K, reprezentând răspunsul la cerința 1 a problemei si mesajul "Datele introduse corespund cerintelor". Dacă C = 2, atunci fişierul de ieşire '''patrate3.out''' conţine pe prima linie numărul natural T, reprezentând răspunsul la cerinţa 2 și mesajul "Datele introduse corespund cerințelor." În caz contrar programul v-a afișa mesajul "Datele introduse nu corespund cenrintelor" și se va inceta executia programului.


== Restricţii şi precizări ==
== Restricţii şi precizări ==
* 3 ⩽ '''n''' ⩽ 2000
* 1 ⩽ '''M''' ⩽ 260.000.000
* 2 ⩽ '''p''' ⩽ 1000
* 1 ⩽ '''N''' ⩽ 2.147.302.920
* numerele de pe cartonaşele elevilor sunt nenule şi mai mici decât 1001
* Numerele N, M, T și K sunt numere naturale
* există cel puţin un număr divizibil cu p pe un cartonaş


== Exemplul 1 ==
== Exemplul 1 ==
; Intrare
; Intrare
: ''grupapregatitoare.in''
: ''patrate3.in''
: 3 7
: 1 3
: 1 2
: 21 4
: 5 6
; Ieșire
; Ieșire
: ''grupapregatitoare.out''
: Datele introduse corespund cerințelor
: 29
: ''patrate3.out''
: 3
: 24
<br>
<br>


== Exemplul 2 ==
== Exemplul 2 ==
; Intrare
; Intrare
: ''grupapregatitoare.in''
: ''patrate3.in''
: 100000000 1000000
: 0 0
: 1 2
: 21 4
: 5 6
; Ieșire
; Ieșire
: ''grupapregatitoare.out''
: Datele introduse nu corespund cerințelor
: Datele introduse nu corespund cerintelor.
<br>
<br>


== Rezolvare ==  
== Rezolvare ==  
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
#2248
#2448
def is_valid_input(n, x, y, v):
import math
     if not (1 <= n <= 20000):
 
         print("Datele introduse nu corespund cerintelor.")
 
        exit()
def validate_input(m, n):
     if not (1 <= x <= n) or not (1 <= y <= n):
     if not (1 <= m <= 260000000):
         print("Datele introduse nu corespund cerintelor.")
         return False
        exit()
     if not (1 <= n <= 2147302920):
     if not (1 <= v <= n ** 2):
        return False
         print("Datele introduse nu corespund cerintelor.")
    # Verifică că M și N sunt numere naturale
         exit()
    if not isinstance(m, int) or not isinstance(n, int):
         return False
    # Verifică că nu există două pătrate cu același număr de valori scrise pe laturi
    num_values = [m, n]
     for i in range(2):
         count = num_values.count(num_values[i])
         if count > 1:
            return False
     return True
     return True




def calculate_coordinates(n, x, y, v):
def read_input():
     # Verifică dacă intrările sunt valide
     with open("patrate3.in", "r") as f:
    if not is_valid_input(n, x, y, v):
        cer, n = map(int, f.readline().split())
        return None
    return cer, n


    # Calculează coordonatele folosind formulele din program
    coord_x = (x - 1) * n + y
    coord_y = v // n if v % n == 0 else v // n + 1
    coord_z = n if v % n == 0 else v % n


     return (coord_x, coord_y, coord_z)
def write_output(output):
     with open("patrate3.out", "w") as f:
        f.write(str(output))




def main():
def solve(cer, n):
     n = int(input())
     if cer == 1:
     x = int(input())
        return 8 * n
    y = int(input())
     else:
    v = int(input())
        m = int(math.sqrt(n))
        if m % 2 == 1:
            return (m + 1) // 2
        else:
            return m // 2


    # Calculează coordonatele folosind funcția definită anterior
    coords = calculate_coordinates(n, x, y, v)


     if coords is None:
if __name__ == '__main__':
         print("Input invalid")
    cer, n = read_input()
     if not validate_input(cer, n):
         print("Datele introduse nu corespund cerintelor.")
     else:
     else:
        # Afișează coordonatele separate printr-un spațiu
         print("Datele introduse corespund cerintelor.")
         print("Datele introduse corespund cerintelor.")
         print(coords[0], coords[1], coords[2])
         output = solve(cer, n)
 
        write_output(output)


main()
</syntaxhighlight>
</syntaxhighlight>


== Explicatie rezolvare ==
== Explicatie rezolvare ==
Acest program citește date de intrare dintr-un fișier numit '''patrate3.in''', validează datele de intrare conform unor criterii prestabilite, rezolvă problema specifică (calculând o valoare pentru variabila output) și afișează rezultatul final într-un fișier numit '''patrate3.out'''.
Funcția '''validate_input(m, n)''' verifică dacă m și n îndeplinesc anumite condiții și returnează True dacă sunt valide, sau False în caz contrar.
Funcția '''read_input()''' deschide fișierul '''patrate3.in''', citește primul număr (cer) și al doilea număr (n) din prima linie, apoi le returnează sub formă de tuplu.
Funcția '''write_output(output)''' deschide fișierul "patrate3.out" și scrie valoarea output în el.
Funcția '''solve(cer, n)''' primește cer și n și returnează o valoare specifică în funcție de valoarea lui cer și n.
În secțiunea main, programul citește datele de intrare, verifică dacă sunt valide prin apelul funcției '''validate_input''', apoi rezolvă problema și afișează rezultatul final dacă datele de intrare sunt valide.

Latest revision as of 18:24, 12 May 2023

Sursa: [1]

Cerinţa[edit | edit source]

Scrieţi un program care rezolvă următoarele două cerinţe:

1. Citește un număr natural M și determină numărul K de valori conținute de pătratul numerotat cu M;

2. Citește un număr natural N și determină numărul T al pătratului care conține numărul N pe una dintre laturi.

Date de intrare[edit | edit source]

Fișierul de intrare patrate3.in conține pe prima linie un număr natural C reprezentând cerința din problemă care trebuie rezolvată (1 sau 2). Dacă C = 1, atunci fişierul conține pe a doua linie numărul natural M. Dacă C = 2, atunci fișierul conține pe a doua linie numărul natural N.

Date de ieșire[edit | edit source]

Dacă C = 1, atunci fişierul de ieşire patrate3.out conţine pe prima linie numărul K, reprezentând răspunsul la cerința 1 a problemei si mesajul "Datele introduse corespund cerintelor". Dacă C = 2, atunci fişierul de ieşire patrate3.out conţine pe prima linie numărul natural T, reprezentând răspunsul la cerinţa 2 și mesajul "Datele introduse corespund cerințelor." În caz contrar programul v-a afișa mesajul "Datele introduse nu corespund cenrintelor" și se va inceta executia programului.

Restricţii şi precizări[edit | edit source]

  • 1 ⩽ M ⩽ 260.000.000
  • 1 ⩽ N ⩽ 2.147.302.920
  • Numerele N, M, T și K sunt numere naturale

Exemplul 1[edit | edit source]

Intrare
patrate3.in
1 3
Ieșire
Datele introduse corespund cerințelor
patrate3.out
24


Exemplul 2[edit | edit source]

Intrare
patrate3.in
0 0
Ieșire
Datele introduse nu corespund cerințelor


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 2448

import math


def validate_input(m, n):

   if not (1 <= m <= 260000000):
       return False
   if not (1 <= n <= 2147302920):
       return False
   # Verifică că M și N sunt numere naturale
   if not isinstance(m, int) or not isinstance(n, int):
       return False
   # Verifică că nu există două pătrate cu același număr de valori scrise pe laturi
   num_values = [m, n]
   for i in range(2):
       count = num_values.count(num_values[i])
       if count > 1:
           return False
   return True


def read_input():

   with open("patrate3.in", "r") as f:
       cer, n = map(int, f.readline().split())
   return cer, n


def write_output(output):

   with open("patrate3.out", "w") as f:
       f.write(str(output))


def solve(cer, n):

   if cer == 1:
       return 8 * n
   else:
       m = int(math.sqrt(n))
       if m % 2 == 1:
           return (m + 1) // 2
       else:
           return m // 2


if __name__ == '__main__':

   cer, n = read_input()
   if not validate_input(cer, n):
       print("Datele introduse nu corespund cerintelor.")
   else:
       print("Datele introduse corespund cerintelor.")
       output = solve(cer, n)
       write_output(output)

</syntaxhighlight>

Explicatie rezolvare[edit | edit source]

Acest program citește date de intrare dintr-un fișier numit patrate3.in, validează datele de intrare conform unor criterii prestabilite, rezolvă problema specifică (calculând o valoare pentru variabila output) și afișează rezultatul final într-un fișier numit patrate3.out.

Funcția validate_input(m, n) verifică dacă m și n îndeplinesc anumite condiții și returnează True dacă sunt valide, sau False în caz contrar.

Funcția read_input() deschide fișierul patrate3.in, citește primul număr (cer) și al doilea număr (n) din prima linie, apoi le returnează sub formă de tuplu.

Funcția write_output(output) deschide fișierul "patrate3.out" și scrie valoarea output în el.

Funcția solve(cer, n) primește cer și n și returnează o valoare specifică în funcție de valoarea lui cer și n.

În secțiunea main, programul citește datele de intrare, verifică dacă sunt valide prin apelul funcției validate_input, apoi rezolvă problema și afișează rezultatul final dacă datele de intrare sunt valide.