1596 - Divizori 1

From Bitnami MediaWiki

Cerinţa[edit | edit source]

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

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

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

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

Exemplu 1[edit | edit source]

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

Exemplu 2[edit | edit source]

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

Rezolvare[edit | edit source]

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

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