4110 - NumarareSD: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: Sursa: [https://www.pbinfo.ro/probleme/4110/numararesd 4110 - NumarareSD] ---- == Cerinţa == Se dă un vector cu '''n''' numere naturale. Să se determine câte dintre perechile de elemente din vector au aceeași sumă a divizorilor. == Date de intrare == Programul citește de la tastatură numărul '''n''', iar apoi '''n''' numere naturale, separate prin spaţii, reprezentând elementele vectorului. == Date de ieșire == Dacă datele sunt introduse corect, pe ecran se va a...
 
mNo edit summary
 
Line 37: Line 37:


import math
import math


def suma_divizorilor(n):
def suma_divizorilor(n):
Line 58: Line 59:




def citire_conform_restrictiilor():
def citire_conform_restrictiilor(vector, n):
    n = int(input())
     if n < 1 or n > 1000:
     if n < 1 or n > 1000:
         print("Datele nu corespund restricțiilor impuse.")
         print("Datele nu corespund restricțiilor impuse.")
         exit()
         exit()
    vector = list(map(int, input().split()))
     for x in vector:
     for x in vector:
         if x < 1 or x > 1000000000:
         if x < 1 or x > 1000000000:
Line 72: Line 71:
         exit()
         exit()
     print("Datele sunt introduse corect.")
     print("Datele sunt introduse corect.")
    return vector, n




vector, n = citire_conform_restrictiilor()
if __name__ == '__main__':
cate_perechi_cu_aceeasi_suma_diviz(vector, n)
    n = int(input())
    vector = list(map(int, input().split()))
    citire_conform_restrictiilor(vector, n)
    cate_perechi_cu_aceeasi_suma_diviz(vector, n)
 




Line 90: Line 92:


</syntaxhighlight>
</syntaxhighlight>
== Explicație rezolvare ==
    '''Funcția suma_divizorilor(n)''' primește un număr întreg n ca argument și calculează suma divizorilor acestuia. Pentru a face acest lucru, se parcurge un interval de la 1 la radicalul pătrat din n (inclusiv), iar pentru fiecare divizor d al lui n, se adaugă la suma sumdiv valoarea lui d și valoarea lui n // d (dacă d nu este egal cu n // d).<br>  '''Funcția cate_perechi_cu_aceeasi_suma_diviz(vector, n)''' primește un vector de numere întregi vector și un număr întreg n reprezentând lungimea vectorului. Această funcție calculează numărul de perechi de indici distincte din vector (i, j), cu i < j, pentru care suma divizorilor elementelor de pe pozițiile i și j din vector este aceeași. Acest lucru se face prin calcularea sumelor divizorilor pentru fiecare element din vector utilizând funcția '''suma_divizorilor(n)''', și apoi compararea acestor sume pentru a identifica perechile cu aceeași sumă de divizori.<br>  '''Funcția citire_conform_restrictiilor(vector, n)''' primește un vector de numere vector și un număr n reprezentând lungimea vectorului. Această funcție verifică dacă valorile lui n și ale elementelor din vector respectă anumite restricții impuse (n trebuie să fie între 1 și 1000, iar elementele vectorului trebuie să fie între 1 și 1000000000, n trebuie să fie lungimea vectorului "vector"), și dacă aceste restricții nu sunt îndeplinite afișează "Datele nu corespund restricțiilor impuse." și încheie execuția programului cu ajutorul comenzii exit(), iar dacă ele sunt îndeplinite afișează "Datele sunt introduse corect." și se continuă programul.<br>  În '''blocul if __name__ == '__main__':''' se realizează citirea valorii lui n de la tastatură, citirea vectorului de numere întregi vector de la tastatură, apelul funcției citire_conform_restrictiilor(vector, n) pentru a verifica restricțiile impuse asupra datelor de intrare, și apelul funcției cate_perechi_cu_aceeasi_suma_diviz(vector, n) pentru a calcula și afișa numărul de perechi de indici cu aceeași sumă de divizori, număr ce reprezintă valoarea cerută în problemă.

Latest revision as of 10:10, 22 April 2023

Sursa: 4110 - NumarareSD


Cerinţa[edit | edit source]

Se dă un vector cu n numere naturale. Să se determine câte dintre perechile de elemente din vector au aceeași sumă a divizorilor.

Date de intrare[edit | edit source]

Programul citește de la tastatură numărul n, iar apoi n numere naturale, separate prin spaţii, reprezentând elementele vectorului.

Date de ieșire[edit | edit source]

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou afișează pe ecran numărul c, reprezentând valoarea cerută. În caz contrar, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse.".

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

  • 1 ⩽ n ⩽ 1000
  • elementele vectorului vor fi cuprinse între 1 și 1.000.000.000

Exemple[edit | edit source]

Exemplul 1[edit | edit source]

Intrare
6
10 3 6 17 9 11
Ieșire
Datele sunt introduse corect.
2

Explicație exemplul 1[edit | edit source]

Perechile de elemente cu aceeași sumă a divizorilor sunt:
10 17 – cu suma 18
6 11 – cu suma 12

Exemplul 2[edit | edit source]

Intrare
5
10 2 -3 4 5
Ieșire
Datele nu corespund restricțiilor impuse.


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 4110

import math


def suma_divizorilor(n):

   sumdiv = 0
   for d in range(1, int(math.sqrt(n))+1):
       if n % d == 0:
           sumdiv += d
           if d != n // d:
               sumdiv += n // d
   return sumdiv


def cate_perechi_cu_aceeasi_suma_diviz(vector, n):

   s = [suma_divizorilor(x) for x in vector]
   c = 0
   for i in range(n):
       for j in range(i+1, n):
           if s[i] == s[j]:
               c += 1
   print(c)


def citire_conform_restrictiilor(vector, n):

   if n < 1 or n > 1000:
       print("Datele nu corespund restricțiilor impuse.")
       exit()
   for x in vector:
       if x < 1 or x > 1000000000:
           print("Datele nu corespund restricțiilor impuse.")
           exit()
   if n != len(vector):
       print("Datele nu corespund restricțiilor impuse.")
       exit()
   print("Datele sunt introduse corect.")


if __name__ == '__main__':

   n = int(input())
   vector = list(map(int, input().split()))
   citire_conform_restrictiilor(vector, n)
   cate_perechi_cu_aceeasi_suma_diviz(vector, n)







</syntaxhighlight>

Explicație rezolvare[edit | edit source]

   Funcția suma_divizorilor(n) primește un număr întreg n ca argument și calculează suma divizorilor acestuia. Pentru a face acest lucru, se parcurge un interval de la 1 la radicalul pătrat din n (inclusiv), iar pentru fiecare divizor d al lui n, se adaugă la suma sumdiv valoarea lui d și valoarea lui n // d (dacă d nu este egal cu n // d).
Funcția cate_perechi_cu_aceeasi_suma_diviz(vector, n) primește un vector de numere întregi vector și un număr întreg n reprezentând lungimea vectorului. Această funcție calculează numărul de perechi de indici distincte din vector (i, j), cu i < j, pentru care suma divizorilor elementelor de pe pozițiile i și j din vector este aceeași. Acest lucru se face prin calcularea sumelor divizorilor pentru fiecare element din vector utilizând funcția suma_divizorilor(n), și apoi compararea acestor sume pentru a identifica perechile cu aceeași sumă de divizori.
Funcția citire_conform_restrictiilor(vector, n) primește un vector de numere vector și un număr n reprezentând lungimea vectorului. Această funcție verifică dacă valorile lui n și ale elementelor din vector respectă anumite restricții impuse (n trebuie să fie între 1 și 1000, iar elementele vectorului trebuie să fie între 1 și 1000000000, n trebuie să fie lungimea vectorului "vector"), și dacă aceste restricții nu sunt îndeplinite afișează "Datele nu corespund restricțiilor impuse." și încheie execuția programului cu ajutorul comenzii exit(), iar dacă ele sunt îndeplinite afișează "Datele sunt introduse corect." și se continuă programul.
În blocul if __name__ == '__main__': se realizează citirea valorii lui n de la tastatură, citirea vectorului de numere întregi vector de la tastatură, apelul funcției citire_conform_restrictiilor(vector, n) pentru a verifica restricțiile impuse asupra datelor de intrare, și apelul funcției cate_perechi_cu_aceeasi_suma_diviz(vector, n) pentru a calcula și afișa numărul de perechi de indici cu aceeași sumă de divizori, număr ce reprezintă valoarea cerută în problemă.