1596 - Divizori 1: Difference between revisions

From Bitnami MediaWiki
No edit summary
 
Line 10: Line 10:


== Date de ieșire ==
== Date de ieșire ==
Fișierul de ieșire '''divizori1.out''' va conține:
Fișierul de ieșire '''divizori1out.txt''' va conține:


* '''Q''' linii, fiecare linie '''i''', reprezentând răspunsul pentru '''Qi'''.
* '''Q''' linii, fiecare linie '''i''', reprezentând răspunsul pentru '''Qi'''.
Line 16: Line 16:
* 1 ⩽ N, Q ⩽ 10.000
* 1 ⩽ N, Q ⩽ 10.000
* 1 ⩽ Qi, Xi ⩽ 100.000
* 1 ⩽ Qi, Xi ⩽ 100.000
== Exemplu ==
== Exemplu 1==
; divizori1.in
; divizori1in.txt
: 5 2
5 2
: 6 2 3 12 4
6 2 3 12 4
: 6
6
: 12
12
; divizori1.ou
; divizori1out.txt
: 3
Datele de intrare corespund restrictiilor impuse
: 5
3
5
== Exemplu 2==
; divizori1in.txt
5 2
6 2 3 12 4
6
123456
; divizori1out.txt
Datele de intrare nu corespund restrictiilor impuse
== Rezolvare ==
== Rezolvare ==
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
# Deschidem fișierul de intrare și citim datele
def validare(n, q, x, queries):
with open('divizori1.in', 'r') as fin:
     if not n.isdigit() or int(n) < 1 or int(n) > 10000:
     n, q = map(int, fin.readline().split())
        return False, "Datele de intrare nu corespund restrictiilor impuse"
    x = list(map(int, fin.readline().split()))
    queries = [int(fin.readline()) for _ in range(q)]


# Inițializăm lista de răspunsuri
    if not q.isdigit() or int(q) < 1 or int(q) > 10000:
answers = []
        return False, "Datele de intrare nu corespund restrictiilor impuse"


# Parcurgem fiecare întrebare
    for val in x:
for query in queries:
        if not val.isdigit() or int(val) < 1 or int(val) > 100000:
    # Calculăm numărul de divizori ai lui query care se află în x
            return False, "Datele de intrare nu corespund restrictiilor impuse"
    answer = sum(1 for xi in x if query % xi == 0)
    # Adăugăm răspunsul la lista de răspunsuri
    answers.append(answer)


# Scriem răspunsurile în fișierul de ieșire
    for val in queries:
with open('divizori1.out', 'w') as fout:
        if not val.isdigit() or int(val) < 1 or int(val) > 100000:
    for answer in answers:
            return False, "Datele de intrare nu corespund restrictiilor impuse"
        fout.write(str(answer) + '\n')
 
    return True, "Datele de intrare corespund restrictiilor impuse"
 
 
def main():
    # Deschidem fișierul de intrare și citim datele
    with open('divizori1in.txt', 'r') as fin:
        n, q = fin.readline().split()
        x = fin.readline().split()
        queries = [line.strip() for line in fin.readlines()]
 
    valid, message = validare(n, q, x, queries)  # apelul functiei de validare
    with open('divizori1out.txt', 'w') as fout:
        fout.write(message + '\n')
        if not valid:
            return
 
    int(n), int(q)
    x = [int(val) for val in x]
    queries = [int(val) for val in queries]
 
    # Inițializăm lista de răspunsuri
    answers = []
 
    # Parcurgem fiecare întrebare
    for query in queries:
        # Calculăm numărul de divizori ai lui query care se află în x
        answer = sum(1 for xi in x if query % xi == 0)
        # Adăugăm răspunsul la lista de răspunsuri
        answers.append(answer)
 
    # Scriem răspunsurile în fișierul de ieșire
    with open('divizori1out.txt', 'a') as fout:
        for answer in answers:
            fout.write(str(answer) + '\n')
 
 
if __name__ == "__main__":
    main()


</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 14:44, 12 December 2023

Cerinţa[edit]

Fie X un vector de numere naturale distincte, de dimensiune N, X = (x[1], x[2], …, x[N]). Se dă un număr natural Q, apoi Q întrebări de forma: “Câţi divizori ai lui Qi se află în şirul X?”. Răspundeţi la cele Q întrebări.

Date de intrare[edit]

Fișierul de intrare divizori1in.txt conține:

  • Pe prima linie 2 numere N și Q, reprezentând dimensiunea lui X şi numărul de întrebări;
  • Pe a doua linie se găsesc N numere separate prin spaţiu, reprezentând elementele vectorului X.
  • Pe următoarele Q linii se găsesc cele Q întrebări, reprezentate printr-un număr Qi pe fiecare linie.

Date de ieșire[edit]

Fișierul de ieșire divizori1out.txt va conține:

  • Q linii, fiecare linie i, reprezentând răspunsul pentru Qi.

Restricţii şi precizări[edit]

  • 1 ⩽ N, Q ⩽ 10.000
  • 1 ⩽ Qi, Xi ⩽ 100.000

Exemplu 1[edit]

divizori1in.txt
5 2
6 2 3 12 4
6
12
divizori1out.txt
Datele de intrare corespund restrictiilor impuse
3
5

Exemplu 2[edit]

divizori1in.txt
5 2
6 2 3 12 4
6
123456
divizori1out.txt
Datele de intrare nu corespund restrictiilor impuse

Rezolvare[edit]

<syntaxhighlight lang="python" line> def validare(n, q, x, queries):

   if not n.isdigit() or int(n) < 1 or int(n) > 10000:
       return False, "Datele de intrare nu corespund restrictiilor impuse"
   if not q.isdigit() or int(q) < 1 or int(q) > 10000:
       return False, "Datele de intrare nu corespund restrictiilor impuse"
   for val in x:
       if not val.isdigit() or int(val) < 1 or int(val) > 100000:
           return False, "Datele de intrare nu corespund restrictiilor impuse"
   for val in queries:
       if not val.isdigit() or int(val) < 1 or int(val) > 100000:
           return False, "Datele de intrare nu corespund restrictiilor impuse"
   return True, "Datele de intrare corespund restrictiilor impuse"


def main():

   # Deschidem fișierul de intrare și citim datele
   with open('divizori1in.txt', 'r') as fin:
       n, q = fin.readline().split()
       x = fin.readline().split()
       queries = [line.strip() for line in fin.readlines()]
   valid, message = validare(n, q, x, queries)  # apelul functiei de validare
   with open('divizori1out.txt', 'w') as fout:
       fout.write(message + '\n')
       if not valid:
           return
   int(n), int(q)
   x = [int(val) for val in x]
   queries = [int(val) for val in queries]
   # Inițializăm lista de răspunsuri
   answers = []
   # Parcurgem fiecare întrebare
   for query in queries:
       # Calculăm numărul de divizori ai lui query care se află în x
       answer = sum(1 for xi in x if query % xi == 0)
       # Adăugăm răspunsul la lista de răspunsuri
       answers.append(answer)
   # Scriem răspunsurile în fișierul de ieșire
   with open('divizori1out.txt', 'a') as fout:
       for answer in answers:
           fout.write(str(answer) + '\n')


if __name__ == "__main__":

   main()

</syntaxhighlight>

Explicatie[edit]

  • 6 conţine 3 divizori în şir(6, 2, 3)
  • 12 conţine 5 divizori în şir(6, 2, 3, 12, 4).